2012-06-17 38 views
6

Web geliştirmede yeni başlayan biriyim. Aşağıdaki kod is_valid() kontrolünde başarısız oluyor. Ama neden anlamıyorum: Form POST verisinden doldurulmalı mı?Django formu is_valid() başarısız olur

Modeli:

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

Görünüm fonksiyonu:

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

Ben benzer konular buldum ve çok çalıştı. Bu şekilde çalışması gerektiğini düşünüyorum. Gerçekten tavsiyeye ihtiyacım var.

+4

Git Belirli bir soruya istedi ve (bunlar biriyse) en iyi cevabı kabul ettik daha önceki sorulara. Bir cevabın yanındaki onay işaretini yerleştirerek bunu yapabilirsiniz. –

cevap

5

. Bu nedenle, form.is_valid(), tüm alanların doğru değerler ile doldurulması ve boş bırakılmaması durumunda True olacaktır. time, user, views alanları gizli alanlar olarak bildirdiniz. Onları şablon formunuzda doldurduğunuzdan emin misiniz? Ayrıca, time = models.DateField() otomatik damga alanını da kullanabilirsiniz. Model alanınızı, model biçimini kendi başınıza doldurmak zorunda kalmazsınız.

Görüşünüz, tüm durumlarda numaralı telefona HttpResponse nesnesini döndürmelidir. Formunuz geçerli değilse, yani form.is_valid() False değerini döndürürse, HttpResponse nesnesi görünümünüz tarafından döndürülemez. Bu, başarısızlığınızın kaynağı olabilir. if form.is_valid() için else deyimi ekleyin:

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

Teşekkür ederim, bu açıkça benim kodumun bir gelişmesidir. Veritabanım için bu formatta tarihe ihtiyacım var: d.strftime ("% Y-% m-% d% H:% M:% S"). Modeldeki tarihi, benimki gibi özel bir formatta başlatabilir miyiz? – JoeFox

+1

'DateField' için auto_now' kullanıldığında, geçerli tarihe sahip olan 'datetime.date' nesnesi değer olarak iletilir. Ve 'DateField''ı okumanız gerektiğinde istediğiniz herhangi bir formatı seçebilirsiniz. Ayrıca, bildiğim kadarıyla, "DateField" sadece tarihi saklayacaktır, yani sadece bu kısmı "% Y -% m -% d". Tarih ve saati saklamanız gerekiyorsa, 'DateTimeField' kullanmalısınız. [DateField] 'a (https://docs.djangoproject.com/en/dev/ref/models/fields/#datefield) ve [DateTimeField]' a bakın (https://docs.djangoproject.com/en/dev/ref/models/alanlar/# datetimefield). – stalk

2

Değişim bu satırı: Bunun için

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

: Modelinizin tüm alanlar gereklidir

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

Teşekkürler, bu benim için iş yaptı. – JoeFox

+2

bekle, ikisi arasındaki fark nedir? Yani, Request.POST'un eksik olduğunu görebiliyorum ... ama bu nasıl yardımcı oluyor? – bharal

İlgili konular