Как мне сгенерировать абсолютные URL-адреса в шаблоне Django?

#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 Я рад, что решение сработало для вас. Я просто исходил из ограниченной информации, представленной в вопросе при публикации решения.