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_nameThis field is required" Как сделать так, чтобы вместо него отображалось "First NameThis field is required"?

Не то чтобы это могло сделать другое, но обратите внимание, что я использую юг и 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)

person user2817200    schedule 25.09.2013    source источник
comment
Не могли бы вы показать свою UsersForm форму?   -  person alecxe    schedule 26.09.2013
comment
Хорошо, просто поставь это. Я также ввел все поля в свою модель.   -  person user2817200    schedule 26.09.2013
comment
Спасибо. Не могли бы вы добавить self.fields['first_name'].label = 'First' в конец __init__() формы и проверить, работает ли это?   -  person alecxe    schedule 26.09.2013
comment
Хорошо, только что сделал, все еще не изменил, как это выглядит при возникновении ошибки: / он все еще говорит first_name Это поле является обязательным. по какой-то причине   -  person user2817200    schedule 26.09.2013
comment
Взгляните, почти в точности ваша проблема: stackoverflow.com/questions/18995034/ :)   -  person alecxe    schedule 26.09.2013
comment
Хм, есть ли место, где я могу найти все возможные ошибки, которые могут быть вызваны формами django CharField? потому что в этом потоке ответ просто говорит, что условие ... Я знаю, что «требуется» - это условие, но я уверен, что это не единственный раз, когда будет выдано сообщение об ошибке для формы charfield. В ответе также говорится, что verbose_name должно работать или неявный способ должен работать, но ни один из них не работает для меня .. любая идея почему? Должен ли я просмотреть весь свой код, чтобы понять, почему это так? Что могло быть причиной того, что verbose_name не работает?   -  person user2817200    schedule 26.09.2013
comment
Что ж, я бы попробовал две вещи одну за другой, просто чтобы найти виновника: 1. удалить валидатор из модели и из поля имени; 2. закомментируйте __init__() вашей формы. Сообщите мне, помог ли какой-либо из этих вариантов. Кроме того, какую версию django вы используете?   -  person alecxe    schedule 26.09.2013
comment
Хм, ни то, ни другое не сработало. Я использую django 1.5.3   -  person user2817200    schedule 26.09.2013
comment
Спасибо, не могли бы вы показать соответствующее представление, которое создает и обрабатывает форму? Кроме того, что, если вы добавите self.fields['first_name'].error_messages = {'required': 'First Name is Required'} в конец формы __init__()?   -  person alecxe    schedule 26.09.2013
comment
Кроме того, вы упомянули ранее о добавлении метки. Как получить доступ к метке полей в шаблоне? field.label у меня не работал. Кроме того, хорошо, поэтому я сделал .error_messages, и он исправил эту одну ошибку и действительно отобразил Требуется имя ... однако, если я хочу сделать это таким образом, не означает ли это, что я должен пройти все возможные ошибки сообщения, которые может генерировать charfield, и изменять их все так, чтобы в нем было написано First Name, а не first_name? Я готов сделать это, если есть место, где перечислены все возможные сообщения об ошибках, которые может вызвать CharField?   -  person user2817200    schedule 26.09.2013


Ответы (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 %}
person jproffitt    schedule 26.09.2013
comment
Ах, интересно, ладно. поэтому я просто копирую этот фрагмент (из строк с 1 по 20) в свой views.py, а затем использую предоставленный вами код и могу получить подробное имя? Или он дает мне ярлык (self.fields ['first_name']. Label = 'first Name')? Кроме того, вы использовали {{field_obj.label}} .. какое поле я могу получить с помощью field_obj? Например, кроме атрибута .label, поскольку я уже знаю, что могу получить к нему доступ, есть ли место для меня, чтобы увидеть список всех других атрибутов, которые я могу получить? - person user2817200; 27.09.2013
comment
Это будет экземпляр BoundField. Таким образом, вы можете получить все атрибуты, которые обычно используются в поле формы. И вы не можете просто вставить фрагмент в свои представления. Это шаблонный фильтр. Вам понадобится папка templatetags в вашем приложении. Прочтите о пользовательских тегах и фильтрах здесь: docs.djangoproject.com/en / dev / howto / custom-template-tags. - person jproffitt; 27.09.2013
comment
Кроме того, label автоматически будет verbose_name из модели. Вам не нужно устанавливать метку вручную. - person jproffitt; 27.09.2013

Некоторое время назад у меня была аналогичная проблема, мне помог этот фрагмент:

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/

person mariodev    schedule 25.09.2013
comment
Хм, я прибегу к нему, если нет другого решения, но почему verbose_name вообще не работает: S Кроме того, если я использую фрагмент, мне следует удалить {% if form.errors%} блок кода из моего шаблона? - person user2817200; 26.09.2013
comment
Я думаю, что {% if form.errors %} не имеет значения, цикл ничего не сделает, если он не пуст. Что касается verbose_name, я понятия не имею, почему он не работает, мы должны осмотреть django src, чтобы узнать и провести большую отладку, я думаю; / - person mariodev; 26.09.2013