【问题标题】:how to show my post only to my friends in django如何仅向 django 中的朋友显示我的帖子
【发布时间】:2021-02-17 17:23:43
【问题描述】:

我只想向我的朋友显示我的帖子,如何过滤我的帖子只给我的朋友?我试图过滤 html 代码,但随着我的朋友越来越多,它重复我的帖子更多(我的意思是重复一个帖子几次) 我的models.py

class PostUser(models.Model):
    posttype        = models.CharField(max_length=3000, default='postuser')
    content         = models.TextField(null = True, blank= True)
    media_image     = models.FileField(null = True, blank= True)
    media_video     = models.FileField(null = True, blank= True)
    per_to          = models.CharField(max_length=300, null=True, blank=True, default='everyone')
    status          = models.CharField(max_length=3000, default='active')
    date            = models.DateField(auto_now_add=True)
    time            = models.TimeField(auto_now_add=True)
    datetime        = models.DateTimeField(auto_now_add=True)
    like            = models.IntegerField(null=True, blank=True)
    comment         = models.IntegerField(null=True, blank=True)
    share           = models.IntegerField(null=True, blank=True)
    user_pk         = models.IntegerField()




class Friends(models.Model):
    # Sender
    friend_one      = models.IntegerField()

    # Reciver
    friend_two      = models.IntegerField()
    
    per_to          = models.CharField(max_length=300, null=True, blank=True, default='everyone')
    status          = models.CharField(max_length=3000, default='active')
    datetime        = models.DateTimeField(auto_now_add=True)
    date            = models.DateField(auto_now_add=True)
    time            = models.TimeField(auto_now_add=True)

这是我的views.py

allmyfriends     = Friends.objects.filter(Q(friend_one = request.user.pk) | Q(friend_two = request.user.pk))

【问题讨论】:

    标签: python django django-models django-rest-framework django-views


    【解决方案1】:

    你可以这样做:-

    models.py

    Choices = (
        (True,'Friends can see  Post'),
        (False,'Friends cannot see Post'),
    )
    
    
    class Friends(models.Model):
        ...................
        only_friends = models.BooleanField(max_length=30,choices=Choices,default=True)
    

    访问views中的Friends模型对象因为我们的BooleanFieldFriends model中所以我们必须先访问Friends模型才能访问only_friends BooleanField

    def some_view(request,user_id):
        allmyfriends = get_object_or_404(Friends,user_user_id)
        p = request.user
        you = p.user
        friends = p.friends.all()
    
        context = {'allmyfriends':allmyfriends,'friends':friends}
        return render(request, 'mains:your_template.html', context}
    

    urls.py

    path('some_view/<int:user_id>/',views.some_view,name='some_view'),
    

    your_template.html

    现在在这里小心工作。

    在显示帖子时,我假设您使用循环来显示所有用户的帖子。喜欢:-

    {% for posts in post %}
    
     {% if posts.user.only_friends == True and posts.user in request.user.friends.all %}
    
        {{ post.posttype }}
    
     {% endif %}
    
    {% endfor %}
    

    注意:- 只有在您设置 PostUser ForeignKey 与 User like 的关系后,此 FrontEnd 才能工作:-

    from django.contrib.auth.models import User
    
    class PostUser(models.Model):
        ..................
        user = models.ForeignKey(User,on_delete=models.CASCADE,default='',unique=True)
    

    同时设置您的 Friends 模型 ForeignKey RelationShip 与 User

    class Friends(models.Model):
        .............
        user = models.ForeignKey(User,on_delete=models.CASCADE,default='',unique=True)
    

    说明:-

    在 models.py 中:- 我添加了一个带有选项的 BooleanField。

    在 views.py 中:- 我访问 Friends 模型以使用 user_id 访问其对象。 (使用 user_id 时仔细检查模板 url)

    在模板中:- 我使用 for loop 显示 all 帖子。并且在 for 循环中我开始 if 声明,如果发布帖子的用户在 request.user 的朋友中并且有 BooleanField True 然后 Post 将显示并且如果 request.user 在发布用户中是not 然后帖子不会显示。

    【讨论】:

    • 如果我的朋友想在家看我的帖子,那我应该怎么写views.py
    • 我尝试了一些问题,试图解决问题,我想是因为我已经更改为 ForeignKey,来自不同视图的其他查询给我带来了问题
    • 你是否为这两个模型设置了ForeignKey Relationship
    • 是的,我做到了,这就是我现在遇到问题的原因
    • 我收到错误,因为我已更改为 ForeignKey,所以我认为从模型中调用它们我必须更改我的查询
    【解决方案2】:

    @Ramin Zamani- 你的朋友模型搞砸了。看看这个。

    将您的模型 Friends 重命名为 UserFriend。这是一个显示两个实体之间关系的模型 - 用户和他/她的朋友/追随者。型号名称不应为复数。

    from django.conf import settings
    class UserFriend(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL)
        friend = models.ForeignKey(settings.AUTH_USER_MODEL)
         ................
    

    另外,我可以使用多对多关系,但我更喜欢外键关系。这取决于您的喜好。

    您的帖子模型需要修复

    class Post(models.Model):
        created_by= models.ForeignKey(settings.AUTH_USER_MODEL)
        ............... 
    

    如果您只想让特定用户查看帖子,那么您可以执行以下操作。 在你的意见中.py

     post = Post.objects.get(slug=self.kwargs.get('name')) 
      #to check if the user trying to access the post is a friend of the postcreator user.
      friend = UserFriend.objects.get(user=post.created_by,friend=self.request.user)
      if friend:
            render()
      else:
           return HttpResponseForbidden()
    

    【讨论】:

    • 更改后如何只向我的朋友显示我的帖子?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2019-07-24
    • 2016-12-13
    相关资源
    最近更新 更多