功能:图片的点赞,要求一个ip能点赞多个图片,但是每个图片只能被相同的ip点赞一次,再次点赞则取消此ip对此图的点赞。
图片的model:
class CustomerWork(models.Model):
Month = (
(1, u'1月'),
(2, u'2月'),
(3, u'3月'),
(4, u'4月'),
(5, u'5月'),
(6, u'6月'),
(7, u'7月'),
(8, u'8月'),
(9, u'9月'),
(10, u'10月'),
(11, u'11月'),
(12, u'12月'),
)
author = models.CharField(max_length=120, verbose_name='作者')
age = models.CharField(max_length=120, verbose_name='作者年龄')
name = models.CharField(max_length=120, verbose_name='作品名字')
type_id = models.ForeignKey(CustomerWorkType, null=True, verbose_name='作品类型')
month = models.IntegerField(verbose_name='月份', choices=Month)
like_ips = models.ManyToManyField(IpSet, verbose_name='点赞ip', blank=True,)
image = models.ImageField(blank=True, upload_to='customer_work/%Y%m%d', verbose_name='小艺术家作品')
class Meta:
verbose_name = '小艺术家作品'
verbose_name_plural = "小艺术家作品"
def __unicode__(self):
return self.name
存储ip的model:
class IpSet(models.Model):
ip_number = models.GenericIPAddressField()
def __unicode__(self):
return self.ip_number
以上,CustomerWork和IpSet通过like_ips多对多关联。
第一步,获取访问者的ip地址:
if request.META.has_key('HTTP_X_FORWARDED_FOR'):
ip = request.META['HTTP_X_FORWARDED_FOR']
else:
ip = request.META['REMOTE_ADDR']
然后判断此ip是否存在于数据库IpSet表中,可通过一下语句判断:
if IpSet.objects.filter(ip_number=ip)
若不在,则可以直接进行点赞操作:把此ip存入数据库,再把点赞的图片的like_ips加上此用户的ip(like_id是用户点赞的图片的id):
new_ip = IpSet()
new_ip.ip_number = ip
new_ip.save()
like_work = CustomerWork.objects.get(id=like_id)
like_work.like_ips.add(new_ip)
like_work.save()
若此ip在数据库中已然存在,则判断此图是否被次ip点赞过,若点过,则取消点赞,否则,点赞:
like_work = CustomerWork.objects.get(id=like_id)
user_ip = IpSet.objects.get(ip_number=ip)
if user_ip in like_work.like_ips.all():
like_work.like_ips.remove(user_ip)
print 'dianguo quxiao'
else:
like_work.like_ips.add(user_ip)
like_work.save()
print 'meidian zan'
获取点赞数的方法是
CustomerWork.objects.get(id=like_id).like_ips.count()