从表单输入重定向到两个不同的视图

时间:2019-06-25 03:54:26

标签: django django-models django-authentication django-permissions

我有一个PostForm模型表单,可以为我的博客应用创建帖子。现在,用户在填写帖子表格后有两个选项,他/她可以立即发布它,也可以将其放入草稿中以供以后发布。发布时,用户将被重定向到该帖子的详细信息视图,而草稿时,用户将被重定向到该用户的草稿列表视图。我不想为帖子草稿创建详细视图。

但是我无法实现如何使用两个不同的提交选项(发布和草稿)将用户重定向到两个不同的视图 形式。

创建视图

    model = Post
    template_name = 'blog/post_form.html'
    form_class = PostForm

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = 'Create'
        return context

    def form_valid(self, form):
        form.instance.author = self.request.user
        form.save()
        return super().form_valid(form)

post_form.html

    model = Post
    template_name = 'blog/post_form.html'
    form_class = PostForm

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = 'Create'
        return context

    def form_valid(self, form):
        form.instance.author = self.request.user
        form.save()
        return super().form_valid(form)

1 个答案:

答案 0 :(得分:1)

您可以尝试这样:

首先在表单中添加两个具有不同名称(即draftpublish)的不同按钮:

<form action="" method="post">
    {{ form }}
    <input type="submit" name="draft" value="Draft" />
    <input type="submit" name="publish" value="Publish" />
</form>

然后在您的创建视图中覆盖get_success_url()方法:

def get_success_url(self):
   if 'draft' in self.request.POST:
       return reverse('draft-url')
   return reverse('publish-url')

更新

可以说您的Blog模型具有get_absolute_url方法,该方法可重定向到已发布的博客。然后您可以像这样使用它:

# model
class Blog(models.Model):
   ...
   def get_absolute_url(self):
       return reverse('blog:publish_post', slug=self.slug)

# view
def get_success_url(self):
   if 'draft' in self.request.POST:
       return redirect('draft-url')
   return super().get_success_url()