Перенаправление на тот же post_id после редактирования сообщения
Я создал сайт форума на Django, где пользователи могут размещать вопросы/ответы и редактировать их. После редактирования ответа я хочу перенаправить пользователя на страницу текущего отредактированного сообщения. например, если пользователь редактирует ответ, который был размещен на вопрос с id 4 (url которого (http://127.0.0.1:8000/discussion/4)), то после редактирования он должен перенаправлять на тот же url
Post view.py
def forum(request):
user = request.user
profile = Profile.objects.all()
if request.method=="POST":
form=PostContent(request.POST)
if form.is_valid():
user = request.user
image = request.user.profile.image
content = request.POST.get('post_content','')
post = Post(user1=user, post_content=content, image=image)
post.save()
messages.success(request, f'Your Question has been posted successfully!!')
return redirect('/forum')
else:
form=PostContent()
posts = Post.objects.filter().order_by('-timestamp')
form= PostContent()
context={
'posts':posts,
'form':form
}
return render(request, "forum.html",context)
reply view.py
def discussion(request, myid):
post = Post.objects.filter(id=myid).first()
replies = Replie.objects.filter(post=post)
if request.method=="POST":
form=ReplyContent(request.POST)
if form.is_valid():
user = request.user
image = request.user.profile.image
desc = request.POST.get('reply_content','')
post_id =request.POST.get('post_id','')
reply = Replie(user = user, reply_content = desc, post=post, image=image)
reply.save()
messages.success(request, f'Your Reply has been posted successfully!!')
return redirect(f'/discussion/{post_id}')
else:
form=ReplyContent()
form= ReplyContent()
return render(request, "discussion.html", {'post':post, 'replies':replies,'form':form})
Редактирование просмотра ответа
def edit_reply(request, pk):
reply = Replie.objects.get(id=pk)
if request.method == 'POST':
form = UpdateReplyForm(request.POST, instance=reply)
if form.is_valid():
form.save()
messages.success(request,"Reply updated successfully!")
return redirect('/forum')
else:
form = UpdateReplyForm(instance=reply)
context = {
'form': form
}
return render(request, 'edit_reply.html', context)
в настоящее время после редактирования ответа я повторно обращаюсь
Вы можете перенаправить его в discussion
вид с его pk
, передав args=[reply.post.id]
в edit_reply
вид.
Попробуйте это: views.py
from django.shortcuts import render, redirect from django.urls import reverse def edit_reply(request, pk): reply = Replie.objects.get(id=pk) if request.method == 'POST': form = UpdateReplyForm(request.POST, instance=reply) if form.is_valid(): form.save() messages.success(request, "Reply updated successfully!") return redirect(reverse('dashboard:discussion', args=[reply.post.id])) else: form = UpdateReplyForm(instance=reply) context = { 'form': form } return render(request, 'home/edit_reply.html', context)
Note:
Формы в django требуютForm
в качестве суффикса, поэтому будет лучше, если он изменится наPostContentForm
иReplyContentForm
сPostContent
иReplyContent
соответственно.
Должно быть
return f'{self.user} Post'не
return f'{self.user`} Post'
Поскольку это не является никаким полем в Replie
модели.
Note:
Имена ForeignKey обычно пишутся в собственном имени и тоже вsnake_case
, будет лучше, если вы изменитеuser1
наuser
вPost
модели.
Для лучшего понимания:
Если имя таблицы PizzaTopingCategory
, то при создании ForeignKey вы должны назвать его как
pizza_toping_category=models.ForeignKey(PizzaTopingCategory, on_delete=models.CASCADE)
Редактирование:
Вам необходимо выяснить post_id
, чтобы вы могли отправить его через:
Попробуйте сделать это в представлении delte_reply
:
def delete_reply(request, pk=None):
reply = Replie.objects.filter(id=pk)
reply_instance = get_object_or_404(Replie,id=pk)
post_pk=reply_instance.post.id
reply.delete()
return redirect(reverse('dashboard:discussion', args=[post_pk]))
Для передачи pk
в представлении discussion
необходимо написать return redirect(reverse('dashboard:discussion', args=[reply.post.id]))
в представлении edit_post
:
views.py
def edit_post(request, pk): post = Post.objects.get(id=pk) if request.method == 'POST': form = UpdatePostForm(request.POST, instance=post) if form.is_valid(): form.save() messages.success(request, "Post updated successfully!") return redirect(reverse('dashboard:discussion', args=[post.id])) else: form = UpdatePostForm(instance=post) context = { 'form': form } return render(request, 'home/edit_post.html', context)