2010-08-09 17 views
35

Widzę, jak dodać komunikat o błędzie do pola podczas korzystania z formularzy, ale co z formularzem modelu?niestandardowe komunikaty o błędach z formularzem modelu

To jest mój model testowy

class Author(models.Model): 
    first_name = models.CharField(max_length=125) 
    last_name = models.CharField(max_length=125) 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 

Mój model forma

class AuthorForm(forms.ModelForm): 
    class Meta: 
     model = Author 

Komunikat o błędzie na polach: first_name i last_name jest "To pole jest wymagane". Jak mogę to zmienić w formie modelu?

Odpowiedz

29

dla prostych przypadkach można specify custom error messages

class AuthorForm(forms.ModelForm): 
    first_name = forms.CharField(error_messages={'required': 'Please let us know what to call you!'}) 
    class Meta: 
     model = Author 
+1

super dzięki. Nie wiedziałem, jaki byłby rezultat tego. Dokumentacja mówi: "Zadeklarowane pola zastąpią domyślne wygenerowane przy użyciu atrybutu modelu", więc powinienem być dobry.Musiałbym również ustawić max_field ponownie w polu formularza modelu. – iJK

+15

Czy konieczne jest powtarzanie deklaracji pól w formularzu? Co powiesz na zasadę DRY, z której dumą django? – paweloque

+0

To nie działa: https://code.djangoproject.com/ticket/13693 – fjsj

7

easyest sposobem jest zastąpić czystą metodę:

class AuthorForm(forms.ModelForm): 
    class Meta: 
     model = Author 
    def clean(self): 
     if self.cleaned_data.get('name')=="": 
     raise forms.ValidationError('No name!') 
     return self.cleaned_data 
15

zastanawiałem się o tym wiele razy, jak również. Właśnie dlatego w końcu napisałem małe rozszerzenie do klasy ModelForm, które pozwala mi ustawić dowolne atrybuty pól - w tym komunikaty o błędach - za pośrednictwem klasy Meta. Kod i wyjaśnienie można znaleźć tutaj: http://blog.brendel.com/2012/01/django-modelforms-setting-any-field.html

Będziesz w stanie robić rzeczy tak:

class AuthorForm(ExtendedMetaModelForm): 
    class Meta: 
     model = Author 
     field_args = { 
      "first_name" : { 
       "error_messages" : { 
        "required" : "Please let us know what to call you!" 
       } 
      } 
     } 

myślę, że to, czego szukasz, prawda?

+0

To świetny sposób na zrobienie tego. Z pewnością więcej DRY niż przedefiniowanie pól formularzy. – suda

+0

@suda nie jesteś na nowo definiowania, nadpisujesz domyślne zachowanie na podstawie skojarzonego modelu. podobnie jak zmiana danych wejściowych do obszaru tekstowego, zastępujesz ustawienie domyślne. – Chris

14

Innym prostym sposobem na zrobienie tego jest właśnie przesłonięcie go w init.

class AuthorForm(forms.ModelForm): 
    class Meta: 
     model = Author 

    def __init__(self, *args, **kwargs): 
     super(AuthorForm, self).__init__(*args, **kwargs) 

     # add custom error messages 
     self.fields['name'].error_messages = {'required': 'Please let us know what to call you!'} 
+0

To działa, na pewno przyjąłby jako odpowiedź – Zac

+1

Jest to znacznie lepsze rozwiązanie niż wszystkie inne w tym wątku, ponieważ 1) Nie musisz używać żadnych rozszerzeń 2) nie musisz przepisywać całej definicji pola formularza, ponieważ to zależy w sprawie definicji pola modelu. +1 –

+2

Jedna myśl pomyślała, musisz użyć jej w ten sposób: 'self.fields ['name']. Error_messages ['required'] = 'Daj nam znać, jak się z tobą połączyć!' Lub używając '.update() 'metoda, w przeciwnym razie zresetujesz wszystkie inne komunikaty o błędach. –

35

New in Django 1.6:

ModelForm akceptuje kilka nowych Meta opcje.

  • Pola znajdujące się na liście localized_fields zostaną zlokalizowane (poprzez ustawienie lokalizacji w polu formularza).
  • Etykiety, opcje help_texts i error_messages mogą być użyte do dostosowania domyślnych pól, patrz: Overriding the default fields w celu uzyskania szczegółowych informacji.

Od że:

class AuthorForm(ModelForm): 
    class Meta: 
     model = Author 
     fields = ('name', 'title', 'birth_date') 
     labels = { 
      'name': _('Writer'), 
     } 
     help_texts = { 
      'name': _('Some useful help text.'), 
     } 
     error_messages = { 
      'name': { 
       'max_length': _("This writer's name is too long."), 
      }, 
     } 

pokrewne: Django's ModelForm - where is the list of Meta options?

+0

Nie rozumiem _() otaczającego tekst komunikatu o niestandardowym komunikacie o błędzie, więc go usunąłem. ale to jest pierwszy fragment, który zadziałał dla mnie. Jestem na Django 1.6. Dziękuję Panu! –

+2

Nie ma za co! Jeśli jesteś ciekawy, funkcja podkreślenia jest popularnym skrótem dla narzędzia do internacjonalizacji: http://stackoverflow.com/questions/2964244/django-meaning-leading-underscore-in-list-tuples-used- to-define-choice-fi – doctaphred

4

mam czystsze rozwiązanie, oparte na odpowiedź jamesmfriedman użytkownika. To rozwiązanie jest jeszcze bardziej suche, szczególnie jeśli masz dużo pól.

custom_errors = { 
    'required': 'Your custom error message' 
} 

class AuthorForm(forms.ModelForm): 
    class Meta: 
     model = Author 

    def __init__(self, *args, **kwargs): 
     super(AuthorForm, self).__init__(*args, **kwargs) 

     for field in self.fields: 
      self.fields[field].error_messages = custom_errors 
1

Można łatwo sprawdzić i umieścić niestandardowy komunikat o błędzie nadrzędnymi clean() sposób i przy użyciu self.add_error(field, message):

def clean(self): 
    super(PromotionForm, self).clean() 
    error_message = '' 
    field = '' 
    # reusable check 
    if self.cleaned_data['reusable'] == 0: 
     error_message = 'reusable should not be zero' 
     field = 'reusable' 
     self.add_error(field, error_message) 
     raise ValidationError(error_message) 

    return self.cleaned_data 
Powiązane problemy