My Own Like Button: Django + Ajax — How?

前端 未结 2 576
予麋鹿
予麋鹿 2020-11-30 23:08

So I\'ve been having trouble turning this view into an Ajax call:

def company_single(request, slug):
    company = get_object_or_404(CompanyProfile, slug=slu         


        
2条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-30 23:59

    I will give you an example. You just learn from it and make changes accordingly.

    myapp.models.py (simplified company model):

    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 for a view):

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

    myapp.views.py (View):

    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')
    

    The template:

    
    
    
    

    Some instructions for using The url tag in template:

    • If Django < 1.3 use url tag without quotes around URL name like this {% url like %}
    • If Django > 1.3 and < 1.5 then you should add {% load url from future %} at top level of your template and enclosed your URL name with quotes as I have done in my answer
    • If Django >= 1.5 then simply remove {% load url from future %} and enclosed URL name with quotes as {% load url from future %} is marked as to be deprecated and will be removed in Django 1.9

提交回复
热议问题