将用户作为参数传递

时间:2018-10-02 14:21:14

标签: django python-3.x url

我有视野:  <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'。

1 个答案:

答案 0 :(得分:0)

简而言之:您不能传递User对象作为参数,而可以传递{{1}的(引用) encoding },但这通常是安全隐患,可能不会比仅通过User来使生活更轻松。

path converters [Django-doc]可能会给人留下错误的印象,但是您不能不能简单地解析各种对象。默认情况下(在撰写本文时),只有五个路径转换器:idstrintsluguuid

因此,您将必须找到“编码”才能将引用传递给该对象。最直接的方法可能是主键,因此您可以像这样实现它:

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>。但是我不知道这是否可以改善情况。