首页 > 解决方案 > 将用户作为参数传递

问题描述

我有视野: <h1>{{article.author}}</h1>

我想将作者传递给 UR:

 <p><a href="{% url 'subscribe' user=article.author %}">Подписаться на пользователя {{article.author}}</a> </p>

网址:

  path('<user:user>',views.sunscribe, name="subscribe")

但我有错误:

“URL 路由 '%s' 使用了无效的转换器 %s。” % (original_route, e) django.core.exceptions.ImproperlyConfigured: URL 路由 '' 使用无效的转换器 'user'。

标签: djangopython-3.xurl

解决方案


简而言之:您不能将User对象作为参数传递,您可以传递(引用) a的编码User,但这通常存在安全风险,并且可能不会比仅传递id.

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

所以你必须找到一个“编码”来传递对对象的引用。最直接的方法可能是主键,所以你可以像这样实现它:

path('<int:user_id>',views.sunscribe, name="subscribe")

并在模板中使用它:

<p>
  <a href="{% url 'subscribe' user=article.author.id %}">
    Подписаться на пользователя {{article.author}}
  </a>
</p>

在这种情况下,您将获得 的iduser并且您将需要获取该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')

这将使过程更加透明,然后您可以使用 Indeed{% url 'subscribe' user=article.author %}<user:user>path(..)定义中。但我不知道这是否会大大改善这种情况。


推荐阅读