#python #django
#python #django
Вопрос:
У меня возникли проблемы с генерацией абсолютного URL-адреса для модели Django. В «courses.html » шаблон Я перебираю две модели, category
и course
, но могу генерировать только относительный URL <slug>
-адрес, а не полный URL /courses/<slug>
-адрес для каждого объекта.
Есть ли какой-либо способ сгенерировать абсолютный URL-адрес для каждого объекта?
главная views.py
def courses(request):
return render(request=request,
template_name="main/courses.html",
context={'courses': Course.objects.all,
'categories': Category.objects.all},
)
courses.html
{% extends "main/header.html" %}
{% block content %}
{% for category in categories %}
<a href="{{ category.slug }}"/>
<p>{{ category }}</p>
</a>
{% endfor %}
{% for course in courses %}
<a href="{{ course.slug }}"/>
<p>{{ course }}</p>
</a>
{% endfor %}
Комментарии:
1. загрузить urls.py пожалуйста, в вашем приложении
Ответ №1:
Проблема
Получить абсолютный URL-адрес для объекта модели, который коррелирует с URL.
Решение
Общей особенностью django является определение get_absolute_url
в модели и использование reverse для построения URL-адреса с контекстом из модели. Сохранение бизнес-логики в контексте модели в модели упрощает обслуживание и автоматическое тестирование. Этот шаблон используется во всей платформе Django (т.Е.: https://github.com/django/django/blob/555e3a848e7ac13580371c7eafbc89195fee6ea9/tests/contenttypes_tests/models.py#L16-L20).
Пример
urls.py
...
path('<int:course_id>/', views.CourseDetail.as_view(), name='course_detail'),
path('<int:category_id>/', views.CategoryDetail.as_view(), name='category_detail'),
...
models.py
class Course(models.Model):
def get_absolute_url(self):
return reverse('course_detail', kwargs={"id": str(self.id)})
class Category(models.Model):
def get_absolute_url(self):
return reverse('category_detail', kwargs={"id": str(self.id)})
courses.html
{% extends "main/header.html" %}
{% block content %}
{% for category in categories %}
<a href="{{ category.get_absolute_url }}"/>
<p>{{ category }}</p>
</a>
{% endfor %}
{% for course in courses %}
<a href="{{ course.get_absolute_url }}"/>
<p>{{ course }}</p>
</a>
{% endfor %}
Комментарии:
1.Спасибо за решение, однако оно не сработало для меня идеально, поэтому мне нужно добавить некоторые настройки, в частности, я должен добавить пространство имен из основного приложения, чтобы иметь возможность корректно изменить. в courses.html
<a href={% url 'main:category_detail' category.slug %}></a>
и в models.py <br/>return reverse('category_detail', kwargs={"slug": str(self.slug)})
2. @Masquerade Я рад, что решение сработало для вас. Я просто исходил из ограниченной информации, представленной в вопросе при публикации решения.