我有视野:
<h1>{{article.author}}</h1>
我想将作者传递给UR:
<p><a href="{% url 'subscribe' user=article.author %}">Подписаться на пользователя {{article.author}}</a> </p>
URL:
path('<user:user>',views.sunscribe, name="subscribe")
但是我有错误:
“ URL路由'%s'使用无效的转换器%s。” %(original_route,e) django.core.exceptions.ImproperlyConfigured:URL路由“使用了无效的转换器'user'。
答案 0 :(得分:0)
简而言之:您不能传递User
对象作为参数,而可以传递{{1}的(引用) encoding },但这通常是安全隐患,可能不会比仅通过User
来使生活更轻松。
path converters [Django-doc]可能会给人留下错误的印象,但是您不能不能简单地解析各种对象。默认情况下(在撰写本文时),只有五个路径转换器:id
,str
,int
,slug
和uuid
。
因此,您将必须找到“编码”才能将引用传递给该对象。最直接的方法可能是主键,因此您可以像这样实现它:
path
,并在模板中按以下方式使用它:
path('<int:user_id>',views.sunscribe, name="subscribe")
在这种情况下,您将获得<p>
<a href="{% url 'subscribe' user=article.author.id %}">
Подписаться на пользователя {{article.author}}
</a>
</p>
中的id
,并且需要获取user
对象。
文档中还提到了如何编写path conversions yourself [Django-doc]。但是,您仍然会传递对象的表示(您可能会因为确实很差的解决方案而生成例如pickle流,但这将是非常不安全的,因为这可能会带来严重的安全风险)。
URL只能包含 text ,不能对象。因此,即使编写了自定义路径转换,您仍然需要某种编码和解码。
您当然可以通过创建路径转换器来简化此过程,该路径转换器可以通过编写自定义路径转换器使生成user
和检索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>
。但是我不知道这是否可以改善情况。