如何路由DetailView继承用户和slug

时间:2016-02-06 20:17:19

标签: django

我有一个相当简单的DetailView:

class TrackDetails(DetailView):
    model = Track

在我的urls.py中:

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

模特:

class Track(models.Model):

    ....


    # Variables

    track_type_choices = [
        ('ORG', 'Original'),
        ('RMX', 'Remix'),
        ('CLB', 'Collab'),
        ('LIV', 'Live'),
    ]

    # Model Fields
    user = models.ForeignKey(User, unique=False)
    title = models.CharField(max_length=100)    
    desc = models.TextField(max_length=7500)
    track_type = models.CharField(max_length=3,
                                 choices=track_type_choices,
                                 default='ORG')

    track_type_content = models.CharField(max_length=100,blank=True)
    created = models.TimeField(auto_now=True,auto_now_add=False)

    upload = models.FileField(upload_to=generate_user_folder_tracks,storage=OverwriteStorage(),validators=[is_mp3])
    albumart = models.ImageField(upload_to=generate_user_folder_art,storage=OverwriteStorage(),validators=[is_square_png])
    private = models.BooleanField(default=False)
    downloadable = models.BooleanField(default=False)

    likes = models.ManyToManyField(User, related_name="likes",blank=True)
    dislikes = models.ManyToManyField(User, related_name="dislikes",blank=True)
    plays = models.BigIntegerField(default=0)

    slug = models.SlugField(max_length=50,unique=True)

视图中显示的模型有一个连接到用户模型的“用户”字段,我想在网址中使用它,所以我不会写“www.domain.com/slug/”而是写“www” .domain.com / user / slug“访问实例的视图。

另外,我使用名为“Display_name”的字段扩展了用户模型,我想在我的模板中显示此字段而不是用户名(track_detail.html):

{% include '__header.html' %}
{% load static from staticfiles %}
<div id="track_container">
    <div id="track_titleinfo">
        <div id="track_artist" class="text">{{ object.user }}</div>
        <div id="track_title" class="text">{{ object.title }}</div>
        {% if object.track_type == 'ORG' %}
        {% else %}
        <div id="track_type" class="text">({{object.track_type_content}})</div>
        {% endif %}
    </div>
</div>
{% include '__footer.html' %}
<img src="/static/users/{{ object.user }}/art/{{ object.slug }}.png" alt="">

ID为“track_artist”的div显示原始用户名(在本例中为enitoni),我希望它从拥有该用户的用户的userprofile类中显示display_name(在本例中为“Ekchö”)跟踪实例:

class UserProfile(models.Model):

    user = models.OneToOneField(User)
    display_name = models.CharField(max_length=50, default="null")

    def create_user_profile(sender, instance, created, **kwargs):
        if created:
            UserProfile.objects.create(user=instance)

    post_save.connect(create_user_profile, sender=User)

2 个答案:

答案 0 :(得分:2)

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

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

然后,由于您使用的是DetailView,因此需要覆盖get_object,以便使用用户名和slug来获取对象。

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

在模板中显示用户的display_name是一个单独的问题。如果您有user,则可以使用user.userprofile向后关注一对一密钥。因此,您可以在模板中显示display_name with。

{{ object.user.userprofile.display_name }}

答案 1 :(得分:0)

要访问usernameslug,请先通过以下两个关键字:

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

然后检查Track.objects.filter(slug=slug, username=username)是否返回任何内容:

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

以前的建议:

  • 您可以在视图中使用get_object_or_404(Track, slug=slug)返回正确的回复。

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

    重定向(&#39; track-username-slug&#39;,用户名= myusername slug = myslug,permanent = True)

其中track-username-slug是您的名字网址