Как перенаправить на страницу и передать данные по перенаправленному URL-адресу? - PullRequest
0 голосов
/ 09 мая 2020
def view_post(request, post_id):
    """Display a blog post"""
    blogpost = BlogPost.objects.get(id=post_id)

    context = {'blogpost': blogpost}
    return render(request, 'blogs/blogpost.html', context)

def new_post(request):
    """Create a new blog post"""
    if request.method != 'POST':
        # No data submitted; create a blank form.
        form = BlogPostForm()
    else:
        # POST data submitted; process data.
        form = BlogPostForm(data=request.POST)
        if form.is_valid():
            form.save()
            return redirect('blogs:index')
    
    # Display a blank or invalid form.
    context = {'form': form}
    return render(request, 'blogs/new_post.html', context)

def edit_post(request, post_id):
    blogpost = BlogPost.objects.get(id=post_id)

    if request.method != 'POST':
        # Initial request; pre-fill form with current blogpost.
        form = BlogPostForm(instance=blogpost)
    else:
        # POST data submitted; process data.
        form = BlogPostForm(instance=blogpost, data=request.POST)
        if form.is_valid():
            form.save()

        view_post(request,post_id)

    # Display form with original contents
    context = {'blogpost': blogpost,'form': form}
    return render(request, 'blogs/edit_post.html', context)

Приведенный выше код предназначен для сайта блога, где пользователи могут создавать, редактировать и просматривать сообщения блога. Edit_post должен обработать сообщение, отредактированное пользователем, а затем перенаправить на сообщение, которое было отредактировано. Насколько мне известно, перенаправление не позволяет отправлять данные, поэтому я безуспешно пытался вложить функцию.

Я видел в Интернете, что файлы cookie / сообщения могут быть решением. Если да, то как я могу это реализовать?

EDIT: Я добавил

        print("DEBUG returning HttpResponseRedirect of reverse of view_post")
        return HttpResponseRedirect(reverse(view_post, args=[post_id]))

в конец else для edit_post, заменив предыдущую попытку view_post на перенаправление. Однако после отправки данных сообщения я получаю сообщение об ошибке NoReverseMatch at /post/edit_post/1/

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Перенаправление не позволяет отправлять данные, насколько мне известно, поэтому я попытался вложить функцию безрезультатно.

Если после редактирования вы хотите, чтобы вас перенаправили в подробное представление из Post, вы можете просто использовать объект HttpResponseRedirect и функцию reverse. Например:

return HttpResponseRedirect(reverse(view_post, args=[post_id]))

0 голосов
/ 18 мая 2020

https://docs.djangoproject.com/en/3.0/topics/http/shortcuts/#redirect

Я обнаружил, что он принимает параметры. Следующий код выполняет то, что мне нужно: return redirect('blogs:view_post', post_id=post_id)

blogs:view_function необходимо для работы обратного направления.

...