Какой шаблон ссылок 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.