7

基本的なブログ アプリケーションで django Class-Based-View を練習しています。ただし、何らかの理由で、私の Post モデルの CreateView が投稿をデータベース内に保存していません。

models.py

class Post(models.Model):
    user = models.ForeignKey(User)
    post_title = models.CharField(max_length=200)
    post_content = models.CharField(max_length=500)
    post_date = models.DateTimeField('date posted')

フォーム.py

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        exclude = ('user', 'post_date')

ビュー.py

class PostCreate(CreateView):
    template_name = 'app_blog/post_save_form.html'
    model = Post
    form_class = PostForm

    def form_valid(self, form):
        form.instance.user = self.request.user
        form.instance.post_date = datetime.now()
        return super(PostCreate, self).form_valid(form)

エラーが発生せずにコンテンツが表示されますが、管理ページを確認すると、CreateView によって作成された投稿がデータベースに保存されていません。

ありがとう

4

4 に答える 4

8

1 つのヒント:excludeフォームを定義するときに を使用fieldsしないでください。より安全であり、推奨される方法です。

リダイレクトはget_success_urlメソッドによって定義されます。モデルにget_absolute_url CreateViewメソッドがある場合、その URL にリダイレクトされます。それ以外の場合は、ビューでいつでもオーバーライドできますget_success_url

使用get_absolute_url:

class Post(models.Model):
    user = models.ForeignKey(User)
    post_title = models.CharField(max_length=200)
    post_content = models.CharField(max_length=500)
    post_date = models.DateTimeField('date posted')

    @permalink
    def get_absolute_url(self):
        return ('myurlname', (), {'myparam': something_useful})

使用get_success_url:

class PostCreate(CreateView):
    template_name = 'app_blog/post_save_form.html'
    model = Post
    form_class = PostForm

    def form_valid(self, form):
        form.instance.user = self.request.user
        form.instance.post_date = datetime.now()
        form.save()
        return super(PostCreate, self).form_valid(form)

    def get_success_url(self):
        return reverse('myurlname', args=(somethinguseful,))

CBV を使用する場合、このページが非常に役立つと思います: http://ccbv.co.uk/projects/Django/1.5/django.views.generic.edit/CreateView/

于 2013-07-24T08:02:50.790 に答える
3

問題は、必須のフィールドを除外しているため、フォームの検証を通過しないことです。

form_valid にアクセスする前に、このフィールドをいくつかのデフォルト値で隠して渡す必要があります。

于 2013-09-21T00:01:35.310 に答える