我举一个例子。你只需从中学习并进行相应的更改。
myapp.models.py(简化的公司模型):
from django.db import modelsfrom django.contrib.auth.models import Userfrom django.template.defaultfilters import slugifyclass 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 HttpResponsetry: from django.utils import simplejson as jsonexcept importError: import jsonfrom django.shortcuts import get_object_or_404from django.contrib.auth.decorators import login_requiredfrom django.views.decorators.http import require_POSTfrom myapp.models import Company@login_required@require_POSTdef 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')模板:
<input type="button" id="like" name="{{ company_slug }}" value="Like" /><script>$('#like').click(function(){ $.ajax({ type: "POST", url: "{% url 'like' %}", data: {'slug': $(this).attr('name'), 'csrfmiddlewaretoken': '{{ csrf_token }}'}, dataType: "json", success: function(response) {alert(response.message);alert('Company likes count is now ' + response.likes_count); }, error: function(rs, e) { alert(rs.responseText); } }); })</script>在模板中使用url标签的一些说明:
- 如果在这样的URL名称周围
Django < 1.3
使用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 - 如果这样的
Django >= 1.5
话,只需删除{% load url from future %}并用引号括起来的URL名称{% load url from future %}标记为已弃用,并将在Django 1.9



