我有两个模型:会员和博客名为MyPosts。我有一个会员详细信息页面,看起来像Facebook个人资料页面,我想在那里列出用户的帖子。我怎么能这样做?
我的会员模特:
class Member(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='members')
member_name = models.CharField(max_length=120)
member_adress = models.CharField(max_length=200)
.
.
slug = models.SlugField(max_length=140, unique=True)
etc.
def __str__(self):
return self.member_name
def get_absolute_url(self):
return reverse('memberships:dashboard')
def _get_unique_slug(self):
slug = slugify(self.member_name)
unique_slug = slug
num = 1
while Member.objects.filter(slug=unique_slug).exists():
unique_slug = '{}-{}'.format(slug, num)
num += 1
return unique_slug
def save(self, *args, **kwargs):
if not self.slug:
self.slug = self._get_unique_slug()
super().save()
我的博客模型:
class MyPosts(models.Model):
user = models.ForeignKey(Member, on_delete=models.CASCADE, blank=False, null=True, related_name='postcreator')
title = models.CharField(max_length=120)
content = models.TextField(max_length=240)
publishing_date = models.DateTimeField(auto_now_add=True)
update_date = models.DateTimeField(auto_now=True)
slug = models.SlugField(max_length=140, unique=True, blank=False, null=True)
def __str__(self):
return self.title
class Meta:
ordering = ['-publishing_date', 'id']
我的详细信息页面视图:
def MemberDetailView(request,pk, slug):
try:
infos = Member.objects.get(pk=pk, slug=slug)
except Member.DoesNotExist:
raise Http404("Member does not exist")
post_list = MyPosts.objects.filter(user=self.request.user.id) # this gives a self error
return render(request, 'directory/member-detail.html', {'memberinfo':infos}, {'memberposts':post_list} )
如何在那里添加我的帖子视图,以便在相同的“会员详情”页面上看到它们?
答案 0 :(得分:3)
您的观点存在两个问题。
首先,MemberDetailView
是视图函数,而不是基于类的视图。因此,您应该使用request
,而不是self.request
。您可以将request.user.id
简化为request.user
。
其次,当你调用render时,上下文应该放在一个字典中。
def MemberDetailView(request, pk, slug):
try:
infos = Member.objects.get(pk=pk, slug=slug)
except Member.DoesNotExist:
raise Http404("Member does not exist")
post_list = MyPosts.objects.filter(user=request.user)
return render(request, 'directory/member-detail.html', {'memberinfo':infos, 'memberposts':post_list})
如果您想进一步改进视图,我建议将其重命名为member_detail_view
以匹配功能名称的PEP8样式指南。您还可以使用get_object_or_404
来简化代码:
from django.shortcuts import get_object_or_404
def member_detail_view(request, pk, slug):
infos = get_object_or_404(Member, pk=pk, slug=slug)
post_list = MyPosts.objects.filter(user=request.user)
return render(request, 'directory/member-detail.html', {'memberinfo':infos, 'memberposts':post_list})