2012-06-17 80 views
6

我是一個真正的web開發初學者。以下代碼在is_valid()檢查中失敗。但我不明白爲什麼:表單應該從POST數據中獲取其數據?Django form is_valid()失敗

型號:

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功能:

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

我發現了類似的主題,並嘗試了很多。這是我認爲它應該工作。我真的需要建議。

+4

轉到你是否在接受最佳答案(如果這些是一個)特定問題前面的問題。您可以通過在答案旁放置複選標記來完成此操作。 –

回答

5

需要模型的所有領域。因此,如果所有字段都填充了正確的值並且沒有空白,則form.is_valid()將爲真。 您已聲明字段timeuserviews爲隱藏字段。你確定,你已經填寫了你的模板表單嗎? 此外,你可能想要自動戳。修改您的模型字段,如

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

之後,您不必自己填寫模板形式。

您的視圖必須在所有情況下返回HttpResponse對象。如果您的表單無效,即form.is_valid()將返回False,則您的視圖將不會返回任何HttpResponse對象。這可能是你失敗的根源。添加else語句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

謝謝,這顯然是我的代碼的改進。對於我的數據庫,我需要這種格式的日期:d.strftime(「%Y-%m-%d%H:%M:%S」)。鑑於我的特殊格式,是否可以在模型中初始化日期? – JoeFox

+1

對'DateField'使用'auto_now'時,具有當前日期的'datetime.date'對象作爲值傳遞。當你需要閱讀'DateField'時,你可以選擇任何你喜歡的格式。此外,據我所知,「DateField」將只存儲日期,即只存儲該部分「%Y-%m-%d」。如果你需要存儲日期和時間,那麼你應該使用'DateTimeField'。查看[DateField](https://docs.djangoproject.com/en/dev/ref/models/fields/#datefield)和[DateTimeField](https://docs.djangoproject.com/zh/dev/ref/models /場/#DateTimeField字段)。 – stalk

2

改變這一行:

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

對於這一點:

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

謝謝,這爲我做了這份工作。 – JoeFox

+2

等,兩者有什麼不同?我的意思是,我可以看到Request.POST已丟失......但這有什麼用? – bharal