【问题标题】:django verbose_name not workingdjango verbose_name 不起作用
【发布时间】:2013-10-01 16:45:57
【问题描述】:

所以我有一个名为 Users 的模型,它有一个名为 first_name 的字段。

class Users(models.Model):
    alpha_field = RegexValidator(regex=r'^[a-zA-Z]+$', message='Name can only contain letters')
    user_id = models.AutoField(unique=True, primary_key=True)
    username = models.SlugField(max_length=50, unique=True)
    first_name = models.CharField(max_length=50, verbose_name='first Name', validators=[alpha_field])
    last_name = models.CharField(max_length=50, validators=[alpha_field])
    password = models.SlugField(max_length=50)

然后我创建了一个 UsersForm,然后在我的模板页面中,当显示任何错误消息时,它不使用详细名称,它使用 first_name。例如,我的显示错误模板代码是

{% for field, error in form.errors.items %}
    {% if forloop.counter == 1 %}
        {{ field }}{{ error | striptags }}
    {% endif %}
{% endfor %}

如果first_name字段有错误,比如我没有填写,仍然点击提交,它会显示这个

"first_name此字段为必填项" 如何让它显示 改为“First NameThis field is required”?

并不是说它可能会有所不同,但请注意我正在使用 south 和 schemamigration 来更新数据库,它最初没有详细的名称,但我最近添加了它,然后只是保存了文件(我没有这样做架构迁移,然后迁移应用程序,因为它表示似乎没有进行任何更改)。

我的用户表单是这样的:

from django import forms
from models import Users

class UsersForm(forms.ModelForm):

    class Meta:
        model = Users
        widgets = {'password':forms.PasswordInput()}

    def __init__(self, *args, **kwargs):
        super( UsersForm, self ).__init__(*args, **kwargs)
        self.fields[ 'username' ].widget.attrs[ 'placeholder' ]="Username"
        self.fields[ 'first_name' ].widget.attrs[ 'placeholder' ]="First Name"  
        self.fields[ 'last_name' ].widget.attrs[ 'placeholder' ]="Last Name"
        self.fields[ 'password' ].widget.attrs[ 'placeholder' ]="Password"
        self.fields['first_name'].label='first Name'

我的观点在这里:

def home_page(request):
    form = UsersForm()
    if request.method == "POST":
        form = UsersForm(request.POST)

        if form.is_valid():
            form.save()
    c = {}
    c.update(csrf(request))
    c.update({'form':form})
    return render_to_response('home_page.html', c)

【问题讨论】:

  • 您能出示您的UsersForm 表格吗?
  • 好吧,放上去吧。我还将模型中的所有字段都放入了。
  • 谢谢。您能否在表单的__init__() 末尾添加self.fields['first_name'].label = 'First' 并检查它是否有效?
  • 好吧,只是做了,但在引发错误时仍然没有改变它的外观:/它仍然说“first_nameThis field is required”。出于某种原因
  • 看看,几乎就是你的问题:stackoverflow.com/questions/18995034/… :)

标签: django django-models django-forms django-templates django-errors


【解决方案1】:

前段时间我也遇到过类似的问题,这个sn-p帮了我:

from django import template
from django import forms
from django.forms.forms import NON_FIELD_ERRORS
from django.forms.util import ErrorDict

register = template.Library()

@register.filter
def nice_errors(form, non_field_msg='General form errors'):
    nice_errors = ErrorDict()
    if isinstance(form, forms.BaseForm):
        for field, errors in form.errors.items():
            if field == NON_FIELD_ERRORS:
                key = non_field_msg
            else:
                key = form.fields[field].label
            nice_errors[key] = errors
    return nice_errors

http://djangosnippets.org/snippets/1764/

【讨论】:

  • 嗯,如果没有其他解决方案,我会求助于它,但是为什么 verbose_name 甚至一开始都不起作用:S 另外,如果我使用 sn-p,那么我应该从我的模板中删除 {% if form.errors %} 代码块?
  • 我认为{% if form.errors %} 无关紧要,如果不为空,循环将不会做任何事情。关于 verbose_name,我不知道为什么它不起作用,我们应该看看 django src 找出并做很多调试;/
【解决方案2】:

form.errors 是字段 NAMES 作为键和错误消息作为值的字典。它不会是verbose_name。您需要从表单中获取该字段,然后为verbose_name 执行field.label。如果您使用此 sn-p 在模板中动态获取对象的属性:https://snipt.net/Fotinakis/django-template-tag-for-dynamic-attribute-lookups/,则可以执行以下操作来获取 verbose_name

{% load getattribute %}

{% for field, error in form.errors.items %}
    {% if forloop.counter == 1 %}
        {% with field_obj=form|getattribute:field %}
            {{ field_obj.label }}{{ error | striptags }}
        {% endwith %}
    {% endif %}
{% endfor %}

【讨论】:

  • 啊,有趣,好吧。所以我只是在我的views.py中复制过去的sn-p(从第1行到第20行),然后使用您提供的代码,我可以获得详细的名称吗?或者它会给我标签(self.fields['first_name'].label='first Name')?另外,您使用了 {{ field_obj.label }}.. 我可以从使用 field_obj 中获得什么字段?就像,除了 .label 属性,因为我已经知道我可以访问它,是否有地方让我查看我可以获得的所有其他属性的列表?
  • 它将是BoundField 的一个实例。因此,您可以获得通常在表单字段上的所有属性。而且您不能只是将 sn-p 粘贴到您的视图中。它是一个模板过滤器。您的应用程序中将需要一个“templatetags”文件夹。在此处阅读自定义标签和过滤器:docs.djangoproject.com/en/dev/howto/custom-template-tags
  • 另外,label 将自动成为模型中的verbose_name。您无需手动设置标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 2012-06-29
  • 2013-12-03
  • 2013-07-03
  • 2014-09-28
  • 2018-10-11
相关资源
最近更新 更多