Перенаправление на домашнюю страницу после отправки пользователем записи в блоге?

Я очень новичок в использовании Django и кодировании в целом. Я понял, как сделать так, чтобы форма отправлялась в мою базу данных, но теперь, когда она отправляется, она просто приводит вас к пустому представлению blog_post, и я не понимаю, как правильно сделать перенаправление.

вот views.py:

from django.shortcuts import render, redirect
from .models import post
from django.views import generic, View
from django.views.decorators.http import require_GET
from django.http import HttpResponse, HttpResponseRedirect
from .forms import PostForm

# Views for post list


class postslist(generic.ListView):
    model = post
    queryset = post.objects.filter(status=1).order_by('-created_on')
    template_name = 'home.html'
    paginate_by = 4

# view for individual post


class postdetail(generic.DetailView):
    model = post
    template_name = "post.html"


def blog_post(request):

    form = PostForm(request.POST or None)

    if request.method == "POST":
        if form.is_valid():
            form.instance.user = request.user
            form.save()
        return redirect("blog:success")

    context = {'form': form,
               }

    return render(request, "create_post.html", context)


def success(request):
    return HttpResponseRedirect("home.html")

urls.py:

from . import views
from django.urls import path, include
from .views import *


urlpatterns = [
    # home
    path('', views.postslist.as_view(), name='home'), 
    # add post
    path('blog_post/', views.blog_post, name='blog_post'),
    # success for blog post
    path('success/', views.success, name='success'),
    # posts
    path('<slug:slug>/', views.postdetail.as_view(), name='post_detail'),
]

Я пробовал несколько вариантов httpresponseredirect и redirect, но я просто не могу разобраться в этом, и я не могу найти это в Интернете. Любая помощь будет высоко оценена.

Предположим, что вы хотите перенаправить в home.html, который отображается в представлении postslist, поэтому представление должно быть таким:

def blog_post(request):

    if request.method == "POST":
       form=PostForm(request.POST)
        if form.is_valid():
            form.instance.user = request.user
            form.save()
            return redirect("blog:home")
    else:
        form = PostForm()

    context = {'form': form,
               }

    return render(request, "create_post.html", context)

Также необходимо указать app_name='blog' в urls.py так:

from . import views
from django.urls import path, include
from .views import *

app_name='blog'

urlpatterns = [
    # home
    path('', views.postslist.as_view(), name='home'), 
    # add post
    path('blog_post/', views.blog_post, name='blog_post'),
    # posts
    path('<slug:slug>/', views.postdetail.as_view(), name='post_detail')
]

Уберите этот success вид, он не нужен.

Вы можете перенаправить на дом в success с помощью:

from django.utils import redirect


def success(request):
    return redirect('blog:home')

Однако вам следует только перенаправлять в случае, если форма была успешной, так:

def blog_post(request):
    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            form.instance.user = request.user
            form.save()
            return redirect('blog:home')  # 🖘 only if the form is valid
    else:
        form = PostForm()
    context = {
        'form': form,
    }
    return render(request, 'create_post.html', context)

Вышеупомянутый делает то же самое, что и CreateView. Таким образом, вы можете реализовать это с помощью:

from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.views.generic import CreateView


class PostCreateView(LoginRequiredMixin, CreateView):
    form_class = PostForm
    template_name = 'create_post.html'
    success_url = reverse_lazy('blog:home')

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

Note: You can limit views to a class-based view to authenticated users with the LoginRequiredMixin mixin [Django-doc].

Вернуться на верх