2012-06-17 17 views
6

Sono un vero principiante nello sviluppo web. Il seguente codice non funziona al controllo is_valid(). Ma non capisco perché: il modulo dovrebbe ottenere i suoi dati compilati dai dati POST o no?Modulo Django is_valid() fallisce

Modello:

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(), 
     } 

Vista funzione:

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)) 

ho trovato argomenti simili e provato un sacco. Questo è come penso che dovrebbe funzionare. Ho davvero bisogno di consigli.

+4

Vai alle domande precedenti che hai chiesto e accettare la risposta migliore (se questi è uno) per una particolare domanda. Puoi farlo posizionando il segno di spunta accanto a una risposta. –

risposta

5

richiesti tutti i campi del modello. Quindi, form.is_valid() sarà True, se tutti i campi sono pieni di valori corretti e non vengono oscurati. Hai dichiarato campi time, user, views come campi nascosti. Sei sicuro di averli riempiti nel modulo? Inoltre, è possibile utilizzare il campo timbro automatico time = models.DateField(). Modifica il tuo campo modello come

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

Dopo questo non devi riempirlo da solo in forma di modello.

La vista deve restituire l'oggetto HttpResponse in tutti i casi. Se il modulo non è valido, ovvero se form.is_valid() restituirà False, l'oggetto HttpResponse non verrà restituito dalla visualizzazione. Questa può essere la fonte del tuo fallimento. Aggiungi else economico 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

Grazie, questo è chiaramente un miglioramento del mio codice. Per il mio database ho bisogno della data in questo formato: d.strftime ("% Y-% m-% d% H:% M:% S"). Sarebbe possibile inizializzare la data nel modello dato un formato speciale come il mio? – JoeFox

+1

Quando 'auto_now' viene usato per' DateField', l'oggetto 'datetime.date' con la data corrente viene passato come valore. E quando hai bisogno di leggere il 'DateField', puoi scegliere qualsiasi formato che ti piace. Inoltre, per quanto ne so, 'DateField' memorizzerà solo la data, cioè solo questa parte'% Y-% m-% d'. Se è necessario memorizzare data e ora, è necessario utilizzare 'DateTimeField'. Guarda [DateField] (https://docs.djangoproject.com/en/dev/ref/models/fields/#datefield) e [DateTimeField] (https://docs.djangoproject.com/en/dev/ref/models/campi/# datetimefield). – stalk

2

Modifica questa linea:

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

Per questo:

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

Grazie, questo ha fatto il lavoro per me. – JoeFox

+2

aspetta, qual è la differenza tra i due? Voglio dire, posso vedere il Request.POST è mancante ... ma come aiuta? – bharal

Problemi correlati