因此,我刚刚学习了如何在博客上添加评论。现在的问题是,我无法将用户重定向到有关的博客文章。这真的很令人沮丧,因为我在互联网上看到很多人都在谈论get_absolute_url,这让我很困惑。
from django.shortcuts import render, redirect
from django.http import HttpResponse
from .models import Annonce, Comments
from django.shortcuts import get_object_or_404
from django.core.paginator import Paginator
def annonceView(request, annonce_id):
annonce = get_object_or_404(Annonce, pk=annonce_id)
comments = Comments.objects.filter(auteur=annonce_id)
if request.method == "POST":
content = request.POST["add_comment"]
if content:
new_comment = Comments.objects.create(content=content, auteur=annonce)
new_comment.save()
return redirect(annonce)
context = {
"annonce": annonce,
"comments": comments,
}
return render(request, "annonces/annonce.html", context)
答案 0 :(得分:1)
您可以在此处使用get_absolute_url
[Django-doc]是正确的。您可以将这种方法添加到模型中,例如:
# app/models.py
from django.db import models
from django.urls import reverse
class Annonce(models.Model):
# ...
def get_absolute_url(self):
return reverse('annonce_detail', kwargs={'pk': self.pk})
annonce_detail
是假设视图的名称,因此在您的urls.py
中,我们的路径类似于:
# app/urls.py
from django.urls import path
from app import views
urlpatterns = [
path('annonce/<int:pk>', views.annonce_detail, name='annonce_detail'),
# ...
]
这意味着对于给定的Annonce
对象,我们可以询问some_annonce.get_absolute_url()
,它将以类似/annonce/123
的方式进行响应。
现在redirect
[Django-doc]将带有get_absolute_url
的模型对象考虑在内。确实,如文档所述:
将
HttpResponseRedirect
返回到相应的网址, 参数已通过。参数可以是:
- 模型:将调用模型的
get_absolute_url()
函数。- 视图名称(可能带有参数:
reverse()
)将用于反向解析该名称。- 绝对或相对URL,将按原样用作重定向位置。
默认情况下会发出临时重定向;通过
permanent=True
发出 永久重定向。
如果因此在该模型上定义了此类get_absolute_url
,则可以将该对象传递给redirect
,例如:
def annonceView(request, annonce_id):
annonce = get_object_or_404(Annonce, pk=annonce_id)
comments = Comments.objects.filter(auteur=annonce_id)
if request.method == "POST":
content = request.POST["add_comment"]
if content:
new_comment = Comments.objects.create(content=content, auteur=annonce)
new_comment.save()
return redirect(annonce)
context = {
"annonce": annonce,
"comments": comments,
}
return render(request, "annonces/annonce.html", context)
注意:模型通常具有单数名称,因此
Comment
,不是Comments
。
注意:您可能需要考虑working with forms [Django-doc],因为给定的输入本身是无效的,并且表单可以进行正确的验证以及删除大量样板代码。
答案 1 :(得分:0)
您正在传递要重定向的对象。
return redirect(annonce)
但是该函数接受字符串:
return redirect("https://www.google.com")
如果您要重定向的网址中包含特定网址:
urlpatterns = [ path("example/", views.ExampleView.as_view(), name="example_view") ]
return redirect(reverse("example_view"))