我自己喜欢的按钮:Django + Ajax – 怎么样?

所以我一直无法将此视图转换为Ajax调用:

def company_single(request, slug): company = get_object_or_404(CompanyProfile, slug=slug) company_list = CompanyProfile.objects.get(slug=slug) try: tcompany = CompanyLikes.objects.get(company=company_list) total_likes = tcompany.likes user_liked = CompanyLikes.objects.get(user=request.user) except: total_likes = 0 instance, created = CompanyLikes.objects.get_or_create(company=company_list) likes_form = CompanyLikesForm(request.POST or None, instance=instance) if likes_form.is_valid(): this = likes_form.save(commit=False) try: if user_liked: this.likes -=1 this.user.remove(request.user) except: this.user.add(request.user) this.likes += 1 this.save() return render_to_response('company.html', locals(), context_instance=RequestContext(request)) 

我想我需要jQuery和JSON,但我不知道如何在这里实现它来为我的网站制作自己的“按钮”。 有什么想法/建议?

我会举个例子。 您只需从中学习并相应地进行更改。

myapp.models.py (简化公司模型):

 from django.db import models from django.contrib.auth.models import User from django.template.defaultfilters import slugify class Company(models.Model): name = models.CharField(max_length=255) slug = models.SlugField() likes = models.ManyToManyField(User, related_name='likes') @property def total_likes(self): """ Likes for the company :return: Integer: Likes for the company """ return self.likes.count() def save(self, *args, **kwargs): self.slug = slugify(self.name) super(Company, self).save(*args, **kwargs) 

myapp.urls.py (视图的URL):

 url(r'^like/$', 'myapp.views.like', name='like'), 

myapp.views.py (查看):

 from django.http import HttpResponse try: from django.utils import simplejson as json except ImportError: import json from django.shortcuts import get_object_or_404 from django.contrib.auth.decorators import login_required from django.views.decorators.http import require_POST from myapp.models import Company @login_required @require_POST def like(request): if request.method == 'POST': user = request.user slug = request.POST.get('slug', None) company = get_object_or_404(Company, slug=slug) if company.likes.filter(id=user.id).exists(): # user has already liked this company # remove like/user company.likes.remove(user) message = 'You disliked this' else: # add a new like for a company company.likes.add(user) message = 'You liked this' ctx = {'likes_count': company.total_likes, 'message': message} # use mimetype instead of content_type if django < 5 return HttpResponse(json.dumps(ctx), content_type='application/json') 

模板:

   

在模板中使用url标记的一些说明:

  • 如果Django < 1.3使用URL名称周围没有引号的url标记,就像这样{% url like %}
  • 如果Django > 1.3 and < 1.5那么你应该{% load url from future %} at top level of your template and enclosed your URL name with quotes as I have done in my answer添加{% load url from future %} at top level of your template and enclosed your URL name with quotes as I have done in my answer
  • 如果Django >= 1.5那么只需删除{% load url from future %}和带有引号的封闭URL名称{% load url from future %}被标记为不推荐使用,并将在Django 1.9删除

在这里写这个,因为我没有足够的评论和编辑声誉必须至少6个字符。 在新版本的Django中,您需要将视图函数的路径或URL的名称作为字符串传递给url模板标记。 因此,上述模板的第7行将是:

 url: "{% url 'like' %}", 

以下是备份此文档的文档部分。