Перенаправление на домашнюю страницу после отправки пользователем записи в блоге?
Я очень новичок в использовании 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].