You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django 2.0中ProfileView报错:需传入pk或slug,如何用username访问?

解决Django DetailView的"must be called with either an object pk or a slug"错误

嘿,我来帮你搞定这个问题!你遇到的错误是因为Django的DetailView默认只会识别pk或者slug这两个URL参数来查询对象,但你现在用的是username作为URL参数,视图不知道该用哪个字段去匹配用户,所以就报错啦。

解决方案很简单,只需要两步:

1. 修改你的ProfileView,指定查询字段和URL参数名

在views.py里给ProfileView添加两个属性,告诉它用username字段来查询,并且URL里的参数名是username:

class ProfileView(views.LoginRequiredMixin, generic.DetailView):
    model = models.User
    template_name = 'accounts/profile.html'
    # 指定用User模型的username字段作为查询条件
    slug_field = 'username'
    # 指定URL中传递的参数名称是username
    slug_url_kwarg = 'username'

2. 调整URL路由的顺序(重要!)

把ProfileView的URL放在路由列表的最后,避免和其他路由冲突。比如如果有用户的用户名刚好是signup或者login,会优先匹配到你的Profile视图,导致其他功能失效。调整后的urls.py应该是这样:

urlpatterns = [
    path('', HomePageView.as_view(), name='home'),
    path('signup', SignUpView.as_view(), name='signup'),
    path('login', LoginView.as_view(), name='login'),
    path('logout', logout_view, name='logout'),
    # 放在最后,确保其他路由先被匹配
    path('<username>', ProfileView.as_view(), name='profile')
]

为什么这样能解决问题?

DetailView默认会尝试用pk参数查询主键,或者用slug参数查询slug字段。当你自定义了slug_field和slug_url_kwarg后,视图就知道要从URL里取username这个参数,然后去User模型里匹配username字段对应的对象啦。

另外,你模板里的{% url 'accounts:profile' user.username %}写法是完全正确的,不需要修改~

内容的提问来源于stack exchange,提问作者user6082142

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:55:43