Вы правы, что можете использовать 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] , так как данный ввод сам по себе недействителен, и форма может сделать правильную проверку, а также удалить много шаблонного кода.