我有一个相当简单的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)
答案 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)
要访问username
和slug
,请先通过以下两个关键字:
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
是您的名字网址