Короче говоря : вы не можете передать объект User
в качестве параметра, вы можете передать кодировку (ссылку на) на User
, но обычно эториск для безопасности, и, вероятно, не сделает жизнь проще, чем простое прохождение id
.
. Возможно, что преобразователи пути [Django-doc] дадутложное впечатление, но вы можете не просто разобрать все виды объектов.По умолчанию (на момент написания) имеется только пять преобразователей пути: str
, int
, slug
, uuid
и path
.
Так что вам нужно будет найти«кодировка» для передачи ссылки на объект.Вероятно, наиболее простым способом является первичный ключ, поэтому вы можете реализовать его следующим образом:
path(<b>'<int:user_id>'</b>,views.sunscribe, name="subscribe")
и использовать в шаблоне его следующим образом:
<p>
<a href="{% url 'subscribe' user=article.author<b>.id</b> %}">
Подписаться на пользователя {{article.author}}
</a>
</p>
В этом случае вы получитеid
из user
, и вам нужно будет извлечь объект user
.
В документации также упоминается, как вы можете самостоятельно написать преобразования пути [Django-doc] .Но, тем не менее, вы передадите представление объекта (вы могли бы, так как действительно плохое решение сгенерирует, например, поток рассола, но это было бы очень небезопасно, поскольку это, вероятно, создавало бы серьезную угрозу безопасности).
URL может содержать только текст , не объекты.Таким образом, даже если вы пишете пользовательское преобразование пути, вам все равно понадобится какое-то кодирование и декодирование.
Конечно, вы можете немного облегчить процесс, сделав преобразователь пути, который сделает процесс генерацииid
и получение прозрачного id
, написав собственный конвертер пути, например:
from django.urls.converters import IntConverter
class UserConverter:
def to_python(self, value):
return User.object.get(pk=value)
def to_url(self, value):
return value.pk
register_converter(converters.UserConverter, 'user')
Это сделает процесс более прозрачным, тогда вы действительно сможете использовать {% url 'subscribe' user=article.author %}
и <user:user>
в определении path(..)
.Но я не знаю, значительно ли это улучшит ситуацию.