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
相关产品推荐
相关产品推荐

