Django Like Button

时间:2013-03-14 11:29:11

标签: django

我一直在尝试为我的应用程序在每个主板上为我的宠物图片创建一个类似按钮,但我无法弄清楚如何创建一个,因为它包含整数。通常我有一个想法和理解功能我创建

当用户点击“赞”按钮时。相似按钮将增加1,它将显示在图片附近。

这是我的图片模块。

class Picture(models.Model):
    user = models.ForeignKey(User)
    board = models.ForeignKey(Board ,related_name='lo')
    image = models.FileField(upload_to="images/",blank=True,null=True)
    description = models.TextField()
    is_primary = models.BooleanField(default=False)

    def __unicode__(self):
        return self.description

有人可以帮我创建一个类似按钮的基础知识吗?所以我可以理解函数的逻辑。

3 个答案:

答案 0 :(得分:21)

我认为很多用户都喜欢很多图片。

你需要另一种模式:

class Like(models.Model):
    user = models.ForeignKey(User)
    picture = models.ForeignKey(Picture)
    created = models.DateTimeField(auto_now_add=True)

并拨打喜欢这样的人数:

p = Picture.objects.get(...)
number_of_likes = p.like_set.all().count()

在视图中增加喜欢的数量:

def like(request, picture_id):
    new_like, created = Like.objects.get_or_create(user=request.user, picture_id=picture_id)
    if not created:
        # the user already liked this picture before
    else:
        # oll korrekt

因此,每当有人点击两次相同的按钮时,他只算作一个。

要确定当前用户是否已经喜欢显示的图像:

def picture_detail(request, id):
    pic = get_object_or_404(Picture, pk=id)
    user_likes_this = pic.like_set.filter(user=request.user) and True or False

希望这有帮助。

答案 1 :(得分:2)

我将与您分享我喜欢的按钮应用体验

首先创建类似app并在like.models内建立

from django.conf import settings
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

class LikeModel(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    liked = models.BooleanField()
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    timestamp = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return str(self.user.username)

然后你应该有一个ajax应用程序我们将执行保存命令只需点击一下心脏或拇指或任何你想要的,一旦你创建ajax应用程序然后不要改变模型中的任何东西只是调整网址并进入ajax.views和建立代码

def like_it(request):
    user = request.user
    if request.method == 'POST':
        ObjectId = int(request.POST['objectid'])
        Tip = str(request.POST['contentType'])

        likes = LikeModel.objects.filter(object_id=ObjectId, content_object=Tip) # in here we filtered the particular post with its id
        if likes: # if the particular post is there
            if str(user) in str(likes): # then we check the user which is us, in there
                like_obj = LikeModel.objects.get(user=user,object_id=ObjectId, content_object=Tip) #if we there and we returned this data, this part for saving data, I mean if this data is already created than we dont have to delete and create again, we just change LikeModel.liked true or false state, so that if you create like and it will never delete, it just change liked or like state
            else:
                pass

        if Tip == 'UserPost':
            post_content_type_by = UserPost.objects.all().first()

            if str(user) not in str(likes):
                like = LikeModel.objects.create(user=user, liked=True, content_object=ContentType.objects.get_for_model(Tip), object_id=ObjectId)
                like.save() # if data is created then we say 'new'
                okey = 'new'

            elif str(user) in str(likes) and like_obj.liked:
                like_obj.liked = False
                like_obj.save() # if data is already there, then we save it False
                okey = 'false'

            elif str(user) in str(likes) and like_obj.liked == False:
                like_obj.liked = True
                like_obj.save() # if data is already changed to False and we save again to True
                okey = 'true'


    return render(request,'ajaxlike.html',{'likes':likes,'okey':okey})

之后我们将创建用于返回和保存ajax数据的ajax模板,我只需将其命名为like.html

  {% if okey == 'new' %}
    new
  {% elif okey == 'false' %}
    false
  {% elif okey == 'true' %}
    true
  {% endif %}

现在创建你的索引html或你想要建立的按钮,并编写jquery代码

  $('.thumb').click(function(){
    var indx = $('.thumb').index(this)
    var ObjectId = $('.ObjectId:eq('+indx+')').text()
    $.ajax({
      type: 'POST',
      url: '/ajax/ajaxlike/',
      data: {
        'contentType':'UserPost',
        'objectid':ObjectId,
        'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val(),
      },
      success: LikePost,
      dataType: 'html'
    });

    function LikePost(data, textStatus, jqXHR){
      if($.trim(data) == 'new'){
        $('.thumb:eq('+indx+')').css('color','#FF0033');
      }else if($.trim(data) == 'false'){
        $('.thumb:eq('+indx+')').css('color','');

      }else if($.trim(data) == 'true'){
        $('.thumb:eq('+indx+')').css('color','#FF0033');

      }
    }
  });

在我们单击拇指的示例上方,它将数据保存在LikeModel中,然后从like.html返回ajax数据,如果数据是新的并且它将拇指变为红色,如果数据为false则表示此数据已保存,但现在你要删除像,所以然后拇指着色回正常颜色,如果数据为真,这意味着你已经创建了像这篇文章的数据,但然后你删除你的拇指,但现在你想再次喜欢所以比拇指再次变红

好的,这几乎已经完成,但请记住,当页面刷新所有彩色拇指并计算页面中未显示的喜欢的时候,所以只需编写一些小代码就可以了,它会再次加载所有内容

所以我们在这里做了,我们在数据库中创建了类似应用程序和类似的表,在用户创建数据之后它将永远不会被用户删除,它只是被一个更改为喜欢的true或false状态布尔字段,所以作为管理员,你总是要保留所有对我们有用的数据,但是棘手的部分是,所有事件都是由javascript处理的,所以你在用jquery编写代码时必须注意,例如确保ajax工作得很好,我也想提到这一点,如果在你的页面中,例如你首先加载10个帖子然后滚动页面和页面自动加载其他10个帖子,那样那么类似的按钮不会工作因为你的页面中的主要jquery代码不能在加载的div中工作,所以我的意思是你必须为此做一些额外的事情,

但主要的想法,我想分享我的自定义和ajax应用程序,它对我有用,这对我来说永远不会失败版本:D,真诚地

答案 2 :(得分:0)

我想做类似的事情,并使用" django-likes"应用程序为我做了工作。

在模型结束时,输入

secretballot.enable_voting_on(Picture)

然后你可以在视图中使用投票。

你可以在这里看到它: https://pypi.python.org/pypi/django-likes/0.1