在 Django 中,使用 ModelForm 可以轻松地创建表单,该表单与模型关联,并且包含所选模型的所有字段。但是,默认情况下,表单字段的标签是根据字段的名称生成的,而不是根据您在模型中定义的 verbose_name。
例如,假设您有一个模型名为
Kaart,其中包含三个字段:name、url 和 kirjeldus。如果您使用 ModelForm 创建一个表单,该表单将显示这三个字段,其标签分别为 name、url 和 kirjeldus。
但是,您可能希望使用更具描述性的标签,例如 Kaardi pealkiri、Asukoha URL 和 注释。要做到这一点,您需要在模型中使用 verbose_name 选项。
2、解决方案
要使用 verbose_name 显示字段别名,请按照以下步骤操作:
- 在您的模型中,使用
verbose_name选项为每个字段定义一个别名。例如:
class Kaart(models.Model):
name = models.CharField(max_length=200, verbose_name="Kaardi pealkiri", help_text="Sisesta kaardi pealkiri (maksimum tähemärkide arv on 38)", blank=False, null=False)
url = models.CharField(max_length=200, verbose_name="Asukoha URL", blank=False, null=False, help_text="Täisasukoht (http://www.domeen.ee/kaart/)")
kirjeldus = models.TextField(max_length=500, verbose_name="Kommentaar", help_text="Informatsioon / viide tegijale (mitte kohustuslik)")
- 在您的表单中,使用
field.verbose_name来获取字段的别名。例如:
class KaartForm(ModelForm):
class Meta:
model = Kaart
def __init__(self, *args, **kwargs):
super(KaartForm, self).__init__(*args, **kwargs)
for field in self.fields:
self.fields[field].label = self.fields[field].verbose_name
- 在您的模板中,使用
{{ field.label }}来显示字段别名。例如:
{% for field in form %}
<p>
<label>{{ field.label }}</label>
<em>{{ field.help_text }}</em>
{{ field }}
</p>
{% endfor %}
现在,表单中的字段标签将显示为 Kaardi pealkiri、Asukoha URL 和 注释,而不是 name、url 和 kirjeldus。
代码例子
以下是一个完整的代码示例,演示如何使用 verbose_name 显示字段别名:
# models.py
class Kaart(models.Model):
name = models.CharField(max_length=200, verbose_name="Kaardi pealkiri", help_text="Sisesta kaardi pealkiri (maksimum tähemärkide arv on 38)", blank=False, null=False)
url = models.CharField(max_length=200, verbose_name="Asukoha URL", blank=False, null=False, help_text="Täisasukoht (http://www.domeen.ee/kaart/)")
kirjeldus = models.TextField(max_length=500, verbose_name="Kommentaar", help_text="Informatsioon / viide tegijale (mitte kohustuslik)")
# forms.py
class KaartForm(ModelForm):
class Meta:
model = Kaart
def __init__(self, *args, **kwargs):
super(KaartForm, self).__init__(*args, **kwargs)
for field in self.fields:
self.fields[field].label = self.fields[field].verbose_name
# views.py
def kaart_view(request):
form = KaartForm()
return render(request, 'kaart_form.html', {'form': form})
# kaart_form.html
{% for field in form %}
<p>
<label>{{ field.label }}</label>
<em>{{ field.help_text }}</em>
{{ field }}
</p>
{% endfor %}