Reputation: 59
I have got two Models: Member and Blog whic is called MyPosts. I have got a Member Detail page which looks like a Facebook profile page and I want to list user's posts there. How can I do that?
My Member Model:
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()
My Blog Model:
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']
My Detail Page View:
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} )
How can I add my post view there to see them on the same "member-detail" page?
Upvotes: 1
Views: 179
Reputation: 308909
There are two issues with your view.
Firstly, MemberDetailView
is a view function, not a class based view. Therefore you should use request
, not self.request
. You can simplify request.user.id
to request.user
.
Secondly, when you call render, the context should go in a single dictionary.
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})
If you want to improve the view further, I recommend renaming it to member_detail_view
to match the PEP8 style guide for function names. You can also use get_object_or_404
to simplify the code:
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})
Upvotes: 3