Django Twitter克隆。如何限制用户不止一次喜欢推文?

时间:2016-09-11 01:59:33

标签: python django

我不知道从哪里开始。现在,用户可以按他们想要的次数按下,并且只会将该推文的总喜欢加起来。

models.py

class Howl(models.Model):
    author = models.ForeignKey(User, null=True)
    content = models.CharField(max_length=150)
    published_date = models.DateTimeField(default=timezone.now)
    like_count = models.IntegerField(default=0)
    rehowl_count = models.IntegerField(default=0)

    def get_absolute_url(self):
        return reverse('howl:index')

    def __str__(self):
        return self.content 

views.py

class HowlLike(UpdateView):
    model = Howl
    fields = []

    def form_valid(self, form):
        instance = form.save(commit=False)
        instance.like_count += 1
        instance.save()

        return redirect('howl:index')

Django Twitter克隆。如何限制用户不止一次喜欢推文?

3 个答案:

答案 0 :(得分:1)

除了跟踪帖子中有Likes个帖子的数量之外,您还可能还希望跟踪谁拥有"喜欢"每个帖子。您可以通过在LikesUser上创建一个包含唯一键的加入表Howl来解决这两个问题。

唯一键会阻止任何User做出重复的喜欢。

您可以使用ManyToManyField在Django中执行此操作,请注意,由于这意味着向User添加第二个Howl关系,因此我们需要通过提供{{1}来消除关系歧义}}

例如:

related_name

class Howl(models.Model): author = models.ForeignKey(User, null=True, related_name='howls_authored') liked_by = models.ManyToManyField(User, through='Like') # ...rest of class as above class Like(models.Model): user = models.ForeignKey(User) howl = models.ForeignKey(Howl) class Meta: unique_together = (('user', 'howl')) 计数会变得多余,因为您可以改为使用like_count

这样做的另一个好处是它允许您存储有关Howl.liked_by.count()的信息 - 例如,当它被添加时。

答案 1 :(得分:0)

一个想法可能是在名为likers的表中添加一列,然后在增加like_counts之前检查models.likers是否包含新的liker。如果没有增加喜欢,如果是,请不要。

答案 2 :(得分:0)

将models.py中的likes_count更改为

liked_by = models.ManyToManyField(User, related_name="likes")

views.py

class HowlLike(UpdateView):

    model = Howl
    fields = []

    def form_valid(self, form):
        instance = form.save(commit=False)
        instance.liked_by.add(self.request.user)

        instance.like_count = instance.liked_by.count()
        instance.save()

        return redirect('howl:index')

的index.html

{{howl.liked_by.count}}