django - 将用户作为参数传递
问题描述
我有视野:
<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'。
解决方案
简而言之:您不能将User
对象作为参数传递,您可以传递(引用) a的编码User
,但这通常存在安全风险,并且可能不会比仅传递id
.
路径转换器[Django-doc]可能给人一种错误的印象,但您不能简单地解析各种对象。默认情况下(在撰写本文时) ,只有五个路径转换器: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
并且您将需要获取该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(..)
定义中。但我不知道这是否会大大改善这种情况。
推荐阅读
- unity3d - 在 Unity 中使用 LeftShift 冲刺的玩家
- c - printf()中变量的提升和转换
- php - 拒绝连接到数据库(Symfony 5)
- tensorflow - keras中的分类交叉熵和稀疏分类交叉熵有什么区别?这些损失函数什么时候合适?
- winapi - OneDrive 中“虚拟文件”背后的 Windows API
- php - 显示用户使用 WP_Query 制作的所有 WooCommerce 产品
- python - 修改消息标签 Python GMAIL API
- node.js - page.click puppeteer 直接到另一个页面不起作用
- docker - 从 docker.hub 下载私有仓库
- c++ - 缺少“MyForm.cs”时如何在 Visual Studio 2019 中重新打开表单设计器?