13

私はWeb開発の真の初心者です。次のコードはis_valid()チェックに失敗しています。しかし、その理由がわかりません。フォームは、POSTデータからデータを入力する必要があるかどうか。

モデル:

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

2 に答える 2

14

モデルのすべてのフィールドが必須です。したがって、form.is_valid()すべてのフィールドに正しい値が入力されていて、空白になっていない場合、True になります。timeフィールド、userを非表示フィールドとして宣言しviewsました。テンプレート フォームに入力したことを確認しますか? また、フィールドに自動スタンプを付けたい場合もありますtime = models.DateField()。モデルフィールドを次のように変更します

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
于 2012-06-17T14:36:53.067 に答える
3

この行を変更します。

    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})
于 2012-06-17T14:31:16.520 に答える