django verbose_name не работает

Итак, у меня есть модель с именем 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"?

Не то чтобы это могло измениться, но учтите, что для обновления базы данных я использую south и schemamigration, изначально у него не было подробного имени, но я недавно добавил его, а затем просто сохранил файл (я не делал schemamigration и затем перенесите приложение, потому что оно говорит, что никаких изменений, похоже, не было сделано).

Моя UsersForm это:

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)

2 ответа

Решение

form.errors словарь полей NAMES в качестве ключей и сообщений об ошибках в качестве значений. Это не будет verbose_name, Вам нужно получить поле из формы, а затем сделать field.label для verbose_name, Если вы используете этот фрагмент для динамического получения атрибута объекта в шаблоне: 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 %}

У меня была похожая проблема некоторое время назад, этот фрагмент помог мне:

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/

Другие вопросы по тегам