首页 > 解决方案 > 如何仅过滤我朋友在模板中的帖子

问题描述

我是 django 新手,正在尝试构建社交网络系统。在我看来,我正在使用配置文件变量导入我的朋友列表。现在我只想显示我朋友的帖子。但无法制定如何过滤所有帖子的逻辑。对于每种方法,我都会遇到不同类型的错误。这是视图:

@login_required
def post_comment_create_and_list_view(request):
    profile = Profile.objects.select_related('user').get(user=request.user).get_all_friends_list()
    #profile contains list of the friends i have
    
    queryset = Post.objects.all_posts().filter(author__icontains=profile.values())
    

    #post form
    post_form = PostModelForm()
    if 'submit_p_form' in request.POST:
        post_form = PostModelForm(request.POST or None, request.FILES or None)
        if post_form.is_valid():
            instance = post_form.save(commit=False)
            instance.author = profile
            instance.save()
            post_form = PostModelForm()
            messages.success(request, 'Post published')
            return redirect('posts:main_post_list')
    
    #comment form
    comment_form = CommentModelForm()
    if 'submit_c_form' in request.POST:
        comment_form = CommentModelForm(request.POST or None)
        if comment_form.is_valid():
            instance = comment_form.save(commit=False)
            instance.user = profile
            post_id = request.POST.get('post_id')
            instance.post = Post.objects.get(id=post_id)
            instance.save()
            comment_form = CommentModelForm()
            return redirect('posts:main_post_list')

    context = {
        'queryset': queryset,
        'profile': profile,
        'post_form': post_form,
        'comment_form': comment_form,
    }
    return render(request, 'posts/main.html', context)

这是帖子模型:

class PostManager(models.Manager):
    def all_posts(self):
        posts = Post.objects.prefetch_related('author',"comment_posted__user",
            "comment_posted__user__user",'likes')
            
        return posts



class Post(models.Model):
    id = models.UUIDField(default=uuid.uuid4, primary_key=True, db_index=True)
    content = models.TextField(db_index=True)
    image = models.ImageField(upload_to='posts', validators=[FileExtensionValidator(['png', 'jpg', 'jpeg'])], blank=True)
    likes = models.ManyToManyField(Profile, blank=True, related_name='profile_liked')
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='posts', db_index=True)
    
    objects = PostManager()

    def __str__(self):
        return str(self.content[:20])

这是配置文件模型:

class Profile(models.Model):
    GENDER = [
        ('NONE', 'none'),
        ('MALE', 'male'),
        ('FEMALE', 'female')
    ]
    name = models.CharField(max_length=200, blank=True)
    id = models.UUIDField(primary_key=True, editable=False)
    bio = models.TextField(default='No bio data', max_length=400)
    user = models.OneToOneField(User, on_delete = models.CASCADE, related_name='profile')
    gender = models.CharField(max_length=6, choices=GENDER, default='NONE')
    country = CountryField()
    avatar = models.ImageField(default='avatars/avatar.png', upload_to='media/avatars/')
    friends = models.ManyToManyField(settings.AUTH_USER_MODEL, blank = True, related_name='friends')
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)
    favourite = models.CharField(max_length=300, blank=True)
    slug = models.SlugField(unique=True,blank=True)
    def __str__(self):
        return self.user.username
    
    def save(self, *args, **kwargs):
        self.id = self.user.id
        self.slug = slugify(self.user.username)
        super().save(*args, **kwargs)

    def get_all_friends(self):
        return self.friends.all()

    def get_all_friends_list(self):
        friend_list= []
        for friend in self.friends.all():
            friend_list.append(friend.profile)
        print(type(friend_list))
        return friend_list

    def get_absolute_url(self):
        """Get url for profile's detail view.

        Returns:
            str: URL for profile detail.

        """
        return reverse("profiles:detail", kwargs={"slug": self.slug})

我要应用的逻辑是从我的朋友列表中获取所有帖子。不是来自每个用户。我应该使用什么方法

标签: pythondjango

解决方案


请在 post_comment_create_and_list_view 中更正 author_in:

queryset = Post.objects.all_posts().filter(author__in=profile)

推荐阅读