使用 verbose_name 显示字段别名

61 阅读2分钟

在 Django 中,使用 ModelForm 可以轻松地创建表单,该表单与模型关联,并且包含所选模型的所有字段。但是,默认情况下,表单字段的标签是根据字段的名称生成的,而不是根据您在模型中定义的 verbose_name。

huake_00198_.jpg 例如,假设您有一个模型名为 Kaart,其中包含三个字段:nameurlkirjeldus。如果您使用 ModelForm 创建一个表单,该表单将显示这三个字段,其标签分别为 nameurlkirjeldus

但是,您可能希望使用更具描述性的标签,例如 Kaardi pealkiriAsukoha URL注释。要做到这一点,您需要在模型中使用 verbose_name 选项。

2、解决方案

要使用 verbose_name 显示字段别名,请按照以下步骤操作:

  1. 在您的模型中,使用 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)")
  1. 在您的表单中,使用 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
  1. 在您的模板中,使用 {{ field.label }} 来显示字段别名。例如:
{% for field in form %}
    <p>
    <label>{{ field.label }}</label>
    <em>{{ field.help_text }}</em>
    {{ field }}
    </p>
{% endfor %}

现在,表单中的字段标签将显示为 Kaardi pealkiriAsukoha URL注释,而不是 nameurlkirjeldus

代码例子

以下是一个完整的代码示例,演示如何使用 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 %}