2017-12-01 18 views
1

MyPostsと呼ばれるメンバーとブログの2つのモデルがあります。 Facebookのプロフィールページのように見えるメンバー詳細ページがあり、そこにユーザーの投稿を掲載したいと思います。どうやってやるの?Django - 別のビューでブログ記事を一覧表示する

マイメンバーモデル:

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

どのように私が見て、私のポストビューがを追加することができますそれらは同じ「メンバー詳細」ページにありますか?

答えて

3

ビューには2つの問題があります。

まず、MemberDetailViewはビュー機能であり、クラスベースのビューではありません。したがってではなくrequestを使用してください。 request.user.idrequest.userをシンプルにすることができます。

第2に、レンダリングを呼び出すと、コンテキストは1つの辞書に入れられます。

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

あなたはさらにビューを改善したい場合は、私は、関数名のPEP8スタイルガイドを一致させるためにmember_detail_viewにそれをリネームお勧めします。 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}) 
+0

ありがとうございます。しかし、私は "'User = request.user"を試してみると "' AnonymousUser 'オブジェクトが反復可能ではないというようなエラーを受けています。 「user」の代わりにuser = request.user.idを試してみると、空白のページが表示されます。私は自分のhtmlがいっぱいだが、dbから取り出されたコンテンツはない。私はそれが私がログインしたユーザーではなかったからだと思う。私がログインすると、「xyzを照会できません」というメッセージが表示されます。「Member」インスタンスである必要があります。投稿したユーザーがログインしても誰でも見ることができるようにするには – demyr

+0

OKです。それは私のコンテンツを呼び出すためのタグを使用する私の間違いでしたが、反対に、かっこを塗りつぶす代わりに "MyPosts.objects.filter()"を使用すると良い結果が得られました。ただし、すべてのユーザーのすべての投稿が表示されます。私が訪問したプロフィールページのユーザーだけでなく、自分が所属する投稿ではなく... – demyr

+0

ログインしているユーザーの代わりにメンバーの投稿を表示したい場合は、 'MyPosts.objects.filter(user = member ) '。オブジェクトをフィルタリングするために 'request.user'を使いたいのであれば、' login_required'デコレータを使って匿名ユーザのエラーを防ぐのが便利です。 – Alasdair

関連する問題