2011-01-03 6 views
1

Ich verwende ModelForm, um mein Formular zu erstellen. Alles funktioniert gut außer 1 Sache - Validierung des einzigartigen Feldes. Code:Problem mit der Validierung von ModelForm

class Article(models.Model): 
... 
title = models.CharField(max_length=255, unique=True, error_messages={'max_length' : 'max translation', 
                            'unique' : 'unique translation', 
                            'required' : 'req translation',}) 
... 

class ArticleForm(ModelForm): 
... 
title = forms.CharField(max_length=255, min_length=3, error_messages={'required' : 'req translation', 
                          'min_length' : 'min translation', 
                          'max_length' : 'max translation', 
                          'unique' : 'unique translation',}) 

Aber wenn ich meine Form mit nicht eindeutigem Titel speichere ich nicht meine Gewohnheit übersetzt Fehler erhalten, aber ich Standard-Fehler. Wie behebe ich das, dass mein eindeutiger Feldfehler angezeigt wird?

EDIT: Ich fand, ich denke, sehr bequeme Möglichkeit, das zu tun. jemand wird es vielleicht verwenden :)

def unique_error_message(self, model_class, unique_check): 
    if 'put_field_name_here' in unique_check and len(unique_check) == 1: 
     return 'Here goes a custom unique error' 

    return super(Article, self).unique_error_message(model_class, unique_check) 
+1

Wo haben Sie in der Dokumentation gesehen, dass 'unique' ein gültiger Schlüssel für das' error_messages' Wörterbuch ist? –

+0

habe ich nicht. Ich dachte, tue es. – robos85

Antwort

1

Es gibt keine unique Schlüssel für Nachrichten Validierung anpassen. Ich würde sagen, es lohnt sich nicht anpassen, aber wenn es sein muss, sollte folgende Ansatz helfen:

import re 
class ArticleForm(ModelForm): 
    def clean(self, *args, **kwargs): 
     result = super(ArticleForm, self).clean(*args, **kwargs) 
     if self.non_field_errors: 
      for i,msg in enumerate(self.non_field_errors): 
       if re.match("^.+ already exists\.$", msg): 
        self.errors["__all__"][i] = custom_msg # Put your own text here 
     return result 

Diese Lösung auf undokumentierte Interna von Django beruht, aber es sollte jetzt den Trick. Auch hier ist meine Empfehlung, mit dem Standard zu bleiben.

Verwandte Themen