Django 如何路由DetailView以继承用户和slug

Django 如何路由DetailView以继承用户和slug,django,Django,我有一个相当简单的详细视图: class TrackDetails(DetailView): model = Track 在my URL.py中: url(r'^(?P<slug>[-\w]+)/$', TrackDetails.as_view(), name='track-details'), 视图中显示的模型有一个连接到用户模型的“user”字段,我想在url中使用它,这样,我就不用写“www.domain.com/slug/”而是写“www.domain.com/u

我有一个相当简单的详细视图:

class TrackDetails(DetailView):
    model = Track
在my URL.py中:

url(r'^(?P<slug>[-\w]+)/$', TrackDetails.as_view(), name='track-details'),
视图中显示的模型有一个连接到用户模型的“user”字段,我想在url中使用它,这样,我就不用写“www.domain.com/slug/”而是写“www.domain.com/user/slug”来访问实例的视图

另外,我用一个名为“Display\u name”的字段扩展了用户模型,我想在我的模板(track\u detail.html)中显示这个字段而不是用户名:


要访问两个关键字中的
username
slug
第一遍:

url(r'^/(?P<username>\d+)/(?P<slug>[-\w]+)/$', get_userpage, name='track-details'),

以前的建议:

  • 您可以在视图中使用
    get\u object\u或_404(Track,slug=slug)
    返回正确的响应

  • 您还可以使用以下命令将用户重定向到用户名和slug的唯一组合:

    重定向('track-username-slug',username=myusername slug=myslug,permanent=True)


如果
track username slug
是您的命名url

要在详细信息视图中包含用户名,首先需要将其添加到url模式中

url(r'^(?P<username>[-\w]+)/(?P<slug>[-\w]+)/$', TrackDetails.as_view(), name='track-details'),
在模板中显示用户的
display\u name
是另一个问题。如果您有
用户
,则可以使用
user.userprofile
按一对一键返回配置文件。因此,在您的模板中,您可以使用显示
display\u name

{{ object.user.userprofile.display_name }}

我想要的是用户名,而不是用户IDI我不完全了解您的使用案例,但它似乎是使用url关键字和重定向的组合,您可以在网站上访问任何您想要的位置抱歉,让我解释得更好一点。每个“Track”实例都有一个用户字段,即“上传”该曲目的用户或“艺术家”,如果愿意,我希望django仅在发现与该曲目相关联的用户时访问该曲目。例如,如果“user1”没有上传任何曲目,“/user1/trackslug”将返回404,但如果user1确实上传了曲目,则访问该曲目。即使“trackslug”存在于任何其他Track实例中,django也只会在用户指定的情况下检索它。好的,我想我对它的理解稍微好一点。所以如果
Track.objects.filter(slug=trackslug,user=user)
返回了一些东西,你想返回那个页面吗?是的!作为比较,有点像soundcloud是如何做到的。键入所需的用户,然后键入要收听的曲目的名称。例如/user/track1。它解决了我的显示名称问题,但是我现在在尝试访问曲目Oops时遇到此错误,它应该是
self.kwargs['username']
,以匹配url。我仍然收到一个错误,现在它说“slug”没有定义。请看:它应该是
slug=self.kwargs['slug']
。哦,我的上帝,你是个救命恩人!谢谢谢谢谢谢谢谢!!
url(r'^/(?P<username>\d+)/(?P<slug>[-\w]+)/$', get_userpage, name='track-details'),
def get_userpage(request, username, slug):
   """Render user page"""
   user = User.objects.get(username=username)
   track_song = Track.objects.filter(slug=trackslug, user=user).first() 
   if track_song:
       # return song page for user

   else:
      # try to return user
      track_user = Track.objects.filter(user=user).first() 
      if track_user:
          # return user page

   # if nothing returned above 
   # return 404
url(r'^(?P<username>[-\w]+)/(?P<slug>[-\w]+)/$', TrackDetails.as_view(), name='track-details'),
from django.shortcuts imporg get_object_or_404

class TrackDetails(DetailView):
    model = Track

    def get_object(self, queryset=None):
        return get_object_or_404(
            Track, 
            user__username=self.kwargs['username'],
            slug=self.kwargs['slug'],,
        )
{{ object.user.userprofile.display_name }}