【问题标题】:Django: django.urls.exceptions.NoReverseMatch: Reverse for 'update' with arguments '('',)' not foundDjango:django.urls.exceptions.NoReverseMatch:没有找到带有参数'('',)'的'update'的反向
【发布时间】:2020-03-05 07:45:56
【问题描述】:

当我在登录后尝试渲染模板时,我得到了

django.urls.exceptions.NoReverseMatch:“更新”的反向 找不到关键字参数'{'pk':''}'。尝试了 1 种模式: ['users/(?P[0-9]+)/update/$']

我在 urls.py 中的一行:

app_name="users"
...

path("users/<int:pk>/update/", view=user_update_view, name="update"),

模板中的行:

<a href="{% url 'users:update' pk=request.user.pk %}">Update user</a>

我看到 request.user.pk 没有提供价值,但我不知道为什么。

【问题讨论】:

  • 您的request.user 似乎没有pk。例如因为它是一个AnonymousUser(如果用户没有登录)。
  • 我明白了。但问题是,我登录了。当我通过表单登录时,身份验证工作,因为我也登录到 django 管理站点。
  • 尝试删除request,改用pk=user.pk
  • @Yellowduck 没用

标签: django django-templates


【解决方案1】:

为了防止在用户未登录时发生这种情况写入

{% if request.user.is_authenticated %}
<a href="{% url 'users:update' %}">Update user</a>
{% else %}
 <p> user not logged in </p> or whatever you want!!
{% endif %}

我认为通过在 url 参数中传递 id 来更新当前登录的用户并不是一个好主意。如果有人故意在地址栏中输入其他 ID,那么他/她可以更新任何人的个人资料。因此,不要像下面那样更改您的网址。 path("users/update/", view=user_update_view, name="update"), 和你的意见

@login_required
def user_update_view(request):
    user= User.objects.get(id=request.user.id)

    # whatever you want!!

【讨论】:

  • 这很奇怪,因为当我通过表单登录时,我已登录到管理站点,但在此视图中用户未经过身份验证。
  • 有什么想法,我应该怎么做,来解决这个问题?
  • 我有 DetailView for User 登录时重定向的地方。那里有一些链接,包括重定向到已登录用户的 UpdateView 的链接。此模板仅在用户登录时显示。
  • 当我在本地测试它时,它可以工作,但我在 digitalocean 上部署以检查生产环境中是否可以正常工作。
猜你喜欢
  • 2021-11-09
  • 2019-08-03
  • 2019-04-14
  • 1970-01-01
  • 2019-09-14
  • 2021-03-01
  • 2021-03-13
  • 1970-01-01
  • 2019-04-21
相关资源
最近更新 更多