Какой шаблон ссылок URL следует использовать в Django

Помогите, пожалуйста, разобраться в этом вопросе.

Я только что узнал, что есть несколько способов создания ссылки в Django:

1. <a href='/blog/{{ object.id }}'>{{ object.title }}</a>

2. <a href='{% url "blog:detail" id=object.id %}'>{{ object.title }}</a>

3. <a href='{{ object.get_absolute_url }}'>{{ object.title }}</a>

Когда я должен использовать эти шаблоны? Есть ли какие-то особенности для выкройки? Большое спасибо.

Вы можете выбрать любой из них.
Я предпочитаю второй вариант.

Обычно при перенаправлении на каноническую страницу объекта имеет смысл использовать метод .get_absolute_url() [Django-doc]. Однако метод get_absolute_url() должен использовать функцию reverse(…) [Django-doc] для указания имени представления, поэтому ваша модель должна выглядеть так:

from django.urls import reverse

class MyModel(models.Model):

    def get_absolute_url(self):
        return reverse('blog:detail', kwargs={'id': self.pk })

Это гарантирует, что он будет правильно кодировать данные в первичном ключе и ссылаться на правильный путь, если вы позже реорганизуете URL (но на самом деле вы не должны реорганизовывать URL в первую очередь, смотрите Cool URLs don't change публикацию организации W3).

Если у вашей модели нет канонического URL, или вы хотите ссылаться на что-то другое, лучше работать с тегом шаблона {% url … %} [Django-doc]. Этот тег шаблона делает много работы за занавесками: (1) он ищет имя представления; (2) он выдает ошибку, если не может найти это представление или если параметры не соответствуют требованиям; (3) он кодирует параметры URL; и (4) он гарантирует, что, записывая абсолютные URL, он не посетит путь, который из-за относительных путей не существует.

Создание ручных путей, как вы делаете в первом примере, является не хорошей идеей. Если, например, {{ object.id }} содержит знак вопроса (?) или хэш (#), то без правильного кодирования URL эти символы не будут отображаться, и таким образом будет построен неправильный URL.

Вернуться на верх