通过onclick设置模型的字段(django)

时间:2017-04-24 10:24:08

标签: javascript python django

这是我的代码:

models.py

class Photos(models.Model):
    username = models.CharField(max_length=50)
    caption = models.CharField(max_length=150, blank=True, null=True)
    img = models.ImageField(upload_to = 'userProfile/static/img', null=True, blank=True)
    update_date = models.DateTimeField(default=timezone.now)
    category = models.CharField(max_length=50, blank=True, null=True)
    likes_count = models.IntegerField(blank=True, null=True)

class Meta:
    managed = False
    db_table = 'photos'

这是我的js代码生成的html代码的一部分

<div class="container_card">
    <img class="container_card_image" onclick="..." src="/static/img/1/uploads/img1.jpg">
</div>

我希望当您点击图片时,'likes_count'会在不刷新页面的情况下递增(例如Instagram或类似于所有社交网络)。

然后,如果我使用<a href="{% url 'like' value=user.id %}> <img ...> </a>和以这种方式定义的视图,它会增加likes_count但不好,因为它会为每次点击重新填充页面

urls.py

urlpatterns = [
    ...
    url(r'^(?P<value>\w+)$', views.like, name='like'),
]

views.py

def like(request, value):
    photo = Photos.objects.get(pk=value)
    photo.likes_count += 1
    photo.save()
    return redirect('home')

有没有办法得到我想要的东西?

1 个答案:

答案 0 :(得分:0)

为了得到你想要的东西,你需要使用ajax。 例如,jquery非常简单,易于发出ajax请求并处理响应。 https://api.jquery.com/jquery.get/

$.post( "photo/15/like", function( data ) {
  // here you handle the response.
});

此外,您的django视图不应该将您重定向到另一个页面,因为这将导致整个页面刷新。相反,你应该使用JsonReponse

def get(self, request, *args, **kwargs):
    photo = Photos.objects.get(pk=value)
    photo.likes_count += 1
    photo.save()
    return JsonResponse({'action': 'success'}, safe=False)

更进一步,您可以使用整个框架来处理像http://www.django-rest-framework.org/这样的json响应,并且为了编写更少的代码,可以使用一些基于类的视图http://www.cdrf.co/