Django - 在另一个视图中列出博客文章

时间:2017-12-01 14:23:10

标签: django django-views

我有两个模型:会员和博客名为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} )

如何在那里添加我的帖子视图,以便在相同的“会员详情”页面上看到它们?

1 个答案:

答案 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})