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

redirecting to two different view from a form input

我有一个 PostForm 模型表单可以为我的博客应用程序创建 posts。现在,用户在填写 post 表单后有两个选择 he/she 可以立即发布,也可以将其放入草稿以供稍后发布。发布后,用户将被重定向到 post 的详细信息视图,但起草后,它将重定向到用户的草稿列表视图。我不想为草稿 post 创建详细视图。

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

创建视图

    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)

你可以这样试试:

首先在您的表单中添加两个不同的按钮,它们具有不同的名称(即 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')

更新

假设您的博客模型有一个 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()