2016-03-20 15 views
0

Ich habe eine clean_message Methode in meiner forms.py erstellt, die überprüft, ob die self.message etwas hat, und löst eine ValidationError, falls nicht.So zeigen Sie Warnmeldungen in Django an

""" 
Comment 
""" 
class CommentForm(forms.Form): 
    """ 
    Comment field 
    """ 
    comment = forms.CharField(
     widget = forms.Textarea(
      attrs = { 
       'class': 'form-control', 
       'rows': 2 
      } 
     ) 
    ) 

    def clean_comment(self): 
     if self.cleaned_data['comment'] is None: 
      raise form.ValidationError({'comment': ['You must enter your comment']) 

Und das ist die Ansichtsdatei. Was brauche ich, um die Fehler anzuzeigen, wie oben gezeigt?

<form action="comment" method="POST"> 
    {% csrf_token %} 
    <div class="form-group"> 
     {{ form.comment.errors }} 
     {{ form.comment }} 
    </div> 
    <div class="form-group"> 
     <input type="submit" value="Say it" class="btn btn-success"> 
    </div> 
</form> 

Ich habe versucht, {{ form.errors }} zu verwenden, über sie iterieren, {{ form.non_field_errors }} usw. zu verwenden, aber keine gearbeitet. Ich denke irgendwie ich lade das Formular neu, und so werden die Nachrichten nicht angezeigt.

Unten ist mein write_comment Verfahren, ausgeführt das Verfahren, wenn Sie auf den Button einen Kommentar zu hinterlassen:

def write_comment(request, post_id): 
    """ 
    Write a new comment to a post 
    """ 
    form = CommentForm(request.POST or None) 

    if form.is_valid(): 
     post = Post.objects.get(pk = post_id) 
     post.n_comments += 1 
     post.save() 

     comment = Comment() 
     comment.comment = request.POST['comment'] 
     comment.created_at = timezone.now() 
     comment.modified_at = timezone.now() 
     comment.post_id = post_id 
     comment.user_id = 2 
     comment.save() 
    else: 
     form = CommentForm() 

    return redirect(reverse('blog:post', args = (post_id,))) 
+0

Ich würde überprüfen Sie die "Aktion" Ihres Formulars. Sind Sie sicher, dass Sie die richtige URL veröffentlichen? In einem anderen Hinweis gibt es keinen Grund, diese Art von Validierung zu machen. Wenn Sie das Feld "required" auf das Feld setzen, wird dies für Sie erledigt. – rnevius

+0

Ich habe die 'required' bereits eingefügt und die' clean_comment' Methode entfernt. Ich habe irgendwo gelesen, dass das Formular nicht neu geladen werden muss, um die Fehler anzuzeigen, und ich denke, dass genau das passiert, aber ich weiß nicht, wie ich es beheben kann. Alles, was ich bisher versucht habe, hat nicht funktioniert. – mfgabriel92

+1

Es gibt mindestens zwei Probleme mit der Ansicht. Erstens, indem Sie 'form = CommentForm()' in der 'else' Anweisung setzen, ersetzen Sie das ungültige Formular (mit Fehlern) durch ein leeres Formular. Zweitens sollten Sie eine Vorlage rendern, die das Formular enthält. Sie leiten stattdessen um. – Alasdair

Antwort

0

Wenn Sie das Feld erforderlich ist, nur required=True verwenden.

comment = CharField(
    required=True, 
    widget = forms.Textarea(
     attrs = { 
      'class': 'form-control', 
      'rows': 2 
     } 
    ) 
) 

Auf diese Weise gibt es keine Notwendigkeit, eine clean_comment Methode zu schreiben. Ihre aktuelle Methode schlägt fehl, weil self.cleaned_data['comment'] die leere Zeichenfolge '' ist, aber Sie zeigen nur einen Fehler an, wenn es None ist. In der Vorlage sollte gut funktionieren.

+0

Ich denke, ich mache etwas falsch, wenn es die Validierung nicht besteht. Die Seite scheint zu aktualisieren und alle Fehlermeldungen zu verbergen. Es funktioniert immer noch nicht, @Alasdair. – mfgabriel92

+0

Ich bin mir nicht sicher, was 'Fehlermeldungen aktualisieren und verbergen' bedeutet. Es könnte etwas mit deiner Sichtweise falsch sein, aber du hast es nicht gezeigt, also können wir es nicht sagen. – Alasdair

+0

Ich habe meine Frage aktualisiert, indem ich die Methode hinzugefügt habe, die für das Schreiben eines neuen Kommentars verantwortlich ist. – mfgabriel92