2016-07-16 13 views
2

У меня проблема с ошибками формы. Я хочу изменить имя поля, которое отображает ошибка формы.Django изменить поле формы сообщение об ошибке

models.py

class Sales(models.Model): 
    customer = models.ForeignKey("Customer") 
    ctype = models.ForeignKey("Customer_type", verbose_name="Customer Type") 

forms.py

from django.utils.translation import ugettext_lazy as _ 
class Sales_form(forms.ModelForm): 
    class Meta: 
     model = Sales 
     fields = ('customer','ctype') 
     error_messages = { 
      'ctype' : { 
       'required' : _("Hey yow! this field is required!") 
      } 
     } 

но ошибка все равно возвращается:

{ "CType": [ "Эй Yow требуется это поле! "]}

Что я хочу, так это

{"Тип клиента": ["Эй, да! это поле обязательно "]}

http://pastebin.com/w6UkjzHF

ответ

1

Вы можете указать метки для полей в Meta, как это:

from django.utils.translation import ugettext_lazy as _ 
class Sales_form(forms.ModelForm): 
    class Meta: 
     model = Sales 
     fields = ('customer','ctype') 
     labels = { 
      'ctype': _('Customer Type'), 
     } 
     error_messages = { 
      'ctype' : { 
       'required' : _("Hey yow! this field is required!") 
      } 
     } 

AFAIK нет никакого прямого способа использовать verbose_name полевой модели как форма этикетки . Вы можете использовать _meta атрибут, хотя:

myfield = models.IntegerField(label=MyModel._meta.get_field('myfield').verbose_name) 

Довольно Hacky в моем тасе потому что вам все равно нужно передать имя поля.

И вы можете также построить этикетки Сыроватского с dictionary comprehension:

labels = {f.name: f.verbose_name for f in MyModel._meta.get_fields()} 

Но будьте осторожны с этим, потому что get_fields также возвращает ManyToManyRel, который не имеет атрибута verbose_name.

Можно также обратиться к документации django render errors.

если вы хотите просто изменить ключи в form.errors Словаре, вы можете сделать это с помощью этого подхода:

labels = {f.name: f.verbose_name for f in MyModel._meta.get_fields()} 
errors_keys = tuple(form.errors.keys()) 
for k in errors_keys: 
    form.errors[labels[k]] = form.errors[k] 
    del form.errors[k] 

Или просто form.errors[labels[k]] = form.errors.pop(k). Также проверьте this вопрос о замене ключа ключа

+0

Благодарим за отзыв @valen. Я попробовал ваш ответ, но метки не работают, и сообщение об ошибке остается тем же. – aldesabido

+0

Может быть, я немного неправильно понимаю ваш вопрос. Вам нужны довольно подробные ярлыки на странице html или просто заменить ключ в ошибках dict? – valignatev

+0

Извините за это. Я просто хочу заменить ключ в erros dict. – aldesabido

Смежные вопросы