0

ブログ プロジェクトの投稿を db に保存するためのフォームを作成しました。インデックスページをデザインしました。今、新しい投稿を作成するためのフォームを作成しようとしています。その前は「manage.pyシェル」を使用していました

これが私の見解です:

def addpost(request):
    form = addForm()
    if request.method=="POST":
        titleform = request.POST['title']
        bodyform = request.POST['body']
        checkform = request.POST['isdraft']
        if form.is_valid():
                n = Post(title = titleform, body = bodyform, isdraft=checkform)
                n.save()

                return HttpResponseRedirect('/admin/')
    else:
        pass
    return render(request,'userside/add.html',{'form':form,})

私のmodel.py:

class Post(models.Model):
    title = models.CharField(max_length = 100)
    body  = models.TextField()
    slug = AutoSlugField(populate_from='title',unique=True)
    posted = models.DateField(auto_now_add=True)
    isdraft = models.BooleanField()
    def __unicode__(self):
        return self.title

    @permalink
    def get_absolute_url(self):
        return ('view_blog_post',None, {'postslug':self.slug})

class addForm(forms.Form):
    title = forms.CharField(max_length=100)
    body  = forms.CharField(widget=forms.Textarea)
    isdraft = forms.BooleanField()

「isdraft」フィールドとしてフォームを送信すると、False(未チェック)になります。次のようなエラーが発生します。

/admin/addpost/ での MultiValueDictKeyError

"キー 'isdraft' が見つかりません"

「isdraft」フィールドとしてフォームを送信すると、True(checked) ; それは何も与えません。さっぱりとしたフォルム。dbにデータを追加しません。

私は間違っている..

ありがとうございました

編集:ドミトリー・ベランスキーの答えは、チェックボックスのエラーに対して機能しました。しかし、まだデータをdbに追加していません。フォームを更新するだけです。

4

3 に答える 3

0

チェックボックスが HTML フォームでチェックされていない場合、その名前/値はブラウザがサーバーに送信するデータに含まれません。これは、request.POST ディクショナリに「isdraft」のエントリが含まれないことを意味し、isdraft 値を読み取ろうとするとキー エラーが発生します。解決策は、投稿されたデータから値を読み取る方法を次のように変更することです。

    checkform = request.POST.get('isdraft', False)

isdraft がディクショナリに見つからない場合にエラーをスローするのではなく、checkform を False (キーが見つからない場合のデフォルト値) に設定します。

于 2012-08-19T18:45:04.827 に答える
0

フォームがまったく検証されない可能性があります。コードが ifform.is_valid()ステートメントの後にそれらの行に到達するかどうかを確認しましたか? もしそうなら、そこで行ったことは正しく、新しいエントリの db 行を作成する必要がありますが、 を使用することもでき
Post.objects.create(....)ましたsave()

ただし、いくつかのポイント:

  • をチェックする代わりに、をチェックしてrequest.POSTくださいrequest.method == 'POST'。空の POST dict を持つ投稿がある可能性があるため (引数が送信されていない場合)、その場合request.POST、正しいチェックを提供できません。
    詳細については、ドキュメントを参照してください: request.POST

  • を使用する代わりに、これをrequest.POST['var_name']使用すると、いくつかの例外が発生する可能性があります(たとえば、チェックフォーム変数で起こったように、引数が提供されていない場合)request.POST.get('var_name', 'default_value')request.POST['var_name']

  • form.cleaned_data を介してこれらの変数にアクセスしてみてください

最後に、最後にelseステートメントは必要ありません。インデントを使用するだけです:)

于 2012-08-19T19:05:11.093 に答える