发表评论后如何重定向我的用户

时间:2019-05-26 21:27:36

标签: python django blogs

因此,我刚刚学习了如何在博客上添加评论。现在的问题是,我无法将用户重定向到有关的博客文章。这真的很令人沮丧,因为我在互联网上看到很多人都在谈论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)

2 个答案:

答案 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"))