2012-06-17 14 views
6

Ich bin ein echter Anfänger in Web-Entwicklung. Der folgende Code schlägt bei der Prüfung is_valid() fehl. Aber ich verstehe nicht warum: Das Formular sollte seine Daten aus den POST-Daten beziehen oder nicht?Django Formular is_valid() schlägt fehl

Modell:

class Statement(models.Model): 
    text = models.CharField(max_length=255) 
    user = models.ForeignKey(User) 
    time = models.DateField() 
    views = models.IntegerField() 

Modelform:

class StatementForm(ModelForm): 
    class Meta: 
     model = Statement 
     widgets = { 
        'time':forms.HiddenInput(), 
        'user':forms.HiddenInput(), 
        'views':forms.HiddenInput(), 
     } 

View-Funktion:

def new(request): 
    if request.method == 'POST': # If the form has been submitted... 
     form = StatementForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): 
      stmt = form.save() 
      path = 'stmt/' + stmt.id 
      return render_to_response(path, {'stmt': stmt}) 
    else: 
     c = {} 
     c.update(csrf(request)) 
     loggedin_user = request.user 
     d = datetime.now() 
     form = StatementForm(request.POST, initial={'time': d.strftime("%Y-%m-%d %H:%M:%S"), 'user':loggedin_user, 'views':0}) 
     return render_to_response('new_stmt.html', {'form': form, },context_instance=RequestContext(request)) 

Ich fand ähnliche Themen und versucht, eine ganze Menge. So sollte es meiner Meinung nach funktionieren. Ich brauche wirklich einen Rat.

+4

Zum früheren Frage, die Sie gefragt haben und akzeptieren die beste Antwort für eine bestimmte Frage (wenn diese eine ist). Sie können dies tun, indem Sie das Häkchen neben eine Antwort setzen. –

Antwort

5

Alle Felder des Modells erforderlich sind. So wird form.is_valid() True, wenn alle Felder mit korrekten Werten gefüllt sind und nicht ausgeblendet sind. Sie haben die Felder time, user, views als versteckte Felder deklariert. Sind Sie sicher, dass Sie diese in Ihrer Vorlage ausgefüllt haben? Sie können auch das Feld time = models.DateField() automatisch stempeln. Ändern Sie Ihr Modellfeld wie

time = models.DateField(auto_now=True)`. 

Danach müssen Sie es nicht selbst in Vorlagenform ausfüllen.

Ihre Ansicht muss das HttpResponse-Objekt in allen Fällen zurückgeben. Wenn Ihr Formular nicht gültig ist, d. H. Wenn form.is_valid() False zurückgibt, wird von Ihrer Ansicht kein Objekt HttpResponse zurückgegeben. Dies kann die Ursache für Ihren Fehler sein. In else Anweisung für if form.is_valid():

from django.http import Http404 
def new(request): 
    if request.method == 'POST': # If the form has been submitted... 
     form = StatementForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): 
      stmt = form.save() 
      path = 'stmt/' + stmt.id 
      return render_to_response(path, {'stmt': stmt}) 
     else: 
      # Do something in case if form is not valid 
      raise Http404 
    else: 
     # Your code without changes 
+0

Danke, das ist eindeutig eine Verbesserung meines Codes. Für meine Datenbank brauche ich das Datum in diesem Format: d.strftime ("% Y-% m-% d% H:% M:% S"). Wäre es möglich, das Datum in dem Modell zu initialisieren, das ein spezielles Format wie meines hat? – JoeFox

+1

Wenn 'auto_now' für' DateField' verwendet wird, wird das 'datetime.date'-Objekt mit dem aktuellen Datum als Wert übergeben. Und wenn Sie das 'DateField' lesen müssen, können Sie ein beliebiges Format wählen. Soweit ich weiß, speichert "DateField" nur das Datum, d. H. Nur diesen Teil "% Y-% m-% d". Wenn Sie Datum und Uhrzeit speichern müssen, sollten Sie 'DateTimeField' verwenden. Suchen Sie nach [DateField] (https://docs.djangoproject.com/de/dev/ref/models/fields/#datefield) und [DateTimeField] (https://docs.djangoproject.com/en/dev/ref/models/fields/# datetimefield). – stalk

2

Ändern Sie diese Zeile:

form = StatementForm(request.POST, initial={'time': d.strftime("%Y-%m-%d %H:%M:%S"), 'user':loggedin_user, 'views':0}) 

Dazu:

form = StatementForm(initial={'time': d.strftime("%Y-%m-%d %H:%M:%S"), 'user':loggedin_user, 'views':0}) 
+0

Danke, das hat den Job für mich erledigt. – JoeFox

+2

warte, was ist der Unterschied zwischen den beiden? Ich meine, ich kann sehen, dass der Request.POST fehlt ... aber wie hilft das? – bharal