必须使用对象 pk 或 slug 调用通用详细视图 ProfileView

Posted

技术标签:

【中文标题】必须使用对象 pk 或 slug 调用通用详细视图 ProfileView【英文标题】:Generic detail view ProfileView must be called with either an object pk or a slug 【发布时间】:2018-07-07 22:37:20 【问题描述】:

我是 Django 2.0 的新手,在访问我的个人资料页面视图时遇到此错误。它正在使用像path('users/<int:id>') 这样的网址,但我希望网址像path('<username>')。不确定到底是什么问题。我希望你能帮忙。

#views.py
class ProfileView(views.LoginRequiredMixin, generic.DetailView):
    model = models.User
    template_name = 'accounts/profile.html'


#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')
]


#base.html
<ul class="dropdown-menu">
    <li><a href="% url 'accounts:profile' user.username %">View Profile</a></li>
    <li><a href="#">Edit Profile</a></li>
</ul>

【问题讨论】:

你确定用户有username吗? % url 'accounts:profile' "bob" % 有效吗? 【参考方案1】:

为什么你不简单地改变你的路径:

url('(?P<username>[\w]+)', ProfileView.as_view(), name='profile')

然后在您的 html 中执行以下操作:

% url 'accounts:profile' username=user.username %

另一种方法是这样做:

url('accounts/profile', ProfileView.as_view(), name='profile')

并在您的个人资料模板中使用 request.user 访问您的用户数据

编辑:

尝试按照here 的说明覆盖get_object 方法

def get_object(self):
    return get_object_or_404(User, pk=request.session['user_id'])

【讨论】:

这并不能以任何方式回答问题。另外,path 不接受正则表达式。 感谢您的回答,但仍然显示相同的错误:( 我用过re_path btw【参考方案2】:

您需要告诉您的视图使用username 作为查找字段。您可以通过在模型上定义slug_fieldslug_url_kwarg 或覆盖get_object 来做到这一点。例如:

class ProfileView(views.LoginRequiredMixin, generic.DetailView):
    model = models.User
    template_name = 'accounts/profile.html'
    slug_field = 'username'
    slug_url_kwarg = 'username'

其中第一个决定在模型查找中使用什么字段;第二个从 URL 模式确定要使用的变量。

【讨论】:

不要忘记接受答案,作为未来搜索者的标志。

以上是关于必须使用对象 pk 或 slug 调用通用详细视图 ProfileView的主要内容,如果未能解决你的问题,请参考以下文章

通用详细视图 UserProfileDetailView 必须在 URLconf 中使用对象 pk 或 slug 调用

在 django 中使用 slugify 后的详细页面错误

将 Pk 或 Slug 传递给 Django 中的通用 DetailView?

难以将 slug 添加到 Django 中的通用详细信息视图

Django:两个模型中的一个 url 搜索(cbv)

更新和删除时如何在一个url链接中发送两个pk