Как перенаправить моего пользователя после публикации комментария - PullRequest
1 голос
/ 27 мая 2019

Итак, я только что узнал, как добавлять комментарии в свой блог. Теперь проблема в том, что я не могу перенаправить своего пользователя на соответствующий пост в блоге. Это действительно расстраивает, потому что я вижу много людей в Интернете, говорящих о 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 ]

1 голос
/ 27 мая 2019

Вы правы, что можете использовать get_absolute_url [Django-doc] здесь. Вы можете добавить такой метод в модель, например:

# app/models.py

from django.db import models
from django.urls import <b>reverse</b>

class Annonce(models.Model):

    # ...

    def <b>get_absolute_url</b>(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=<b>'annonce_detail'</b>),
    # ...
]

Это означает, что для данного Annonce объекта мы можем задать some_annonce.get_absolute_url(), и он ответит чем-то вроде /annonce/123.

Теперь redirect [Django-doc] учитывает объекты модели с get_absolute_url. Действительно, как сказано в документации:

Возвращает HttpResponseRedirect на соответствующий URL для аргументы переданы.

Аргументы могут быть:

  • A модель : будет вызвана функция 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 <b>redirect(annonce)</b>

    context = {
        "annonce": annonce,
        "comments": comments,
    }

    return render(request, "annonces/annonce.html", context)

Примечание : модели обычно имеют единственное число имен, поэтому Comment, не Comments.

Примечание : вы можете рассмотреть работу с формами [Django-doc] , так как данный ввод сам по себе недействителен, и форма может сделать правильную проверку, а также удалить много шаблонного кода.

0 голосов
/ 27 мая 2019

Вы передаете объект для перенаправления.

return redirect(annonce)

Но функция принимает строку:

return redirect("https://www.google.com")

Если у вас есть определенный URL в URL, который вы хотите перенаправить:

urlpatterns = [ path("example/", views.ExampleView.as_view(), name="example_view") ]

return redirect(reverse("example_view"))
...