перенаправление на два разных представления из ввода формы

У меня есть форма модели 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)

person Gaurav Sahu    schedule 25.06.2019    source источник


Ответы (1)


Вы можете попробовать так:

Сначала добавьте в форму две разные кнопки с разными именами (например, draft и publish):

<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()
person ruddra    schedule 25.06.2019
comment
Но я получаю ошибку MultiValueDictKeyError при передаче поля slug для публикации URL-адреса публикации. def get_success_url(self): if 'publish' in self.request.POST: return redirect('blog:publish_post', slug=self.request.POST['slug']) return redirect('blog:drafts_posts') - person Gaurav Sahu; 25.06.2019
comment
@GauravSahu, пожалуйста, смотрите раздел обновления ответа - person ruddra; 25.06.2019
comment
get_success_url должен возвращать URL-адрес, поэтому он не должен сам вызывать перенаправление. - person Daniel Roseman; 25.06.2019
comment
@DanielRoseman да, ты прав, мой плохой. Я обновил ответ. Спасибо. - person ruddra; 25.06.2019