2012-06-17 9 views
6

私はWeb開発の真の初心者です。次のコードはis_valid()のチェックで失敗しています。しかし、私は理由を理解していない:フォームは、POSTデータからそのデータを埋めるべきかどうか?Djangoフォームは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(), 
     } 

ビュー機能:

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

移動し、(これらが1である場合)、最良の答えを受け入れる特定の質問について:if form.is_valid()ためelseのステートメントを追加します。これを行うには、回答の横にチェックマークを付けます。 –

答えて

5

モデルのすべてのフィールドが必要とされています。したがって、form.is_valid()は、すべてのフィールドが正しい値で埋められ、ブランキングされていない場合はTrueになります。 フィールドtime,user,viewsを非表示フィールドとして宣言しました。あなたはあなたのテンプレートフォームにそれらを記入したと確信していますか? また、フィールドtime = models.DateField()に自動スタンプすることもできます。モデルフィールドを

のように変更する
time = models.DateField(auto_now=True)`. 

これ以降、テンプレートフォームで自分で記入する必要はありません。

あなたのビューは、すべてのケースでHttpResponseオブジェクトを返す必要があります。フォームが有効でない場合、つまりform.is_valid()がFalseを返す場合は、HttpResponseオブジェクトは表示されません。これはあなたの失敗の原因になる可能性があります。あなたが求めてきました以前の質問に

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

'auto_now'を' DateField'に使用すると、現在の日付を持つ 'datetime.date'オブジェクトがvalueとして渡されます。そして 'DateField'を読む必要があるときは、好きなフォーマットを選ぶことができます。また、私が知る限り、 'DateField'は日付のみ、つまりこの部分'%Y-%m-%d'だけを保存します。日付と時刻を格納する必要がある場合は、 'DateTimeField'を使用してください。 Look [DateField](https://docs.djangoproject.com/en/dev/ref/models/fields/#datefield)と[DateTimeField](https://docs.djangoproject.com/ja/dev/ref/models)/fields /#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

待って、2つの違いは何ですか?私は、Request.POSTが見つからないことがわかります...しかし、それはどのように役立ちますか? – bharal