My Own Like Button: Django + Ajax — How?

前端 未结 2 567
予麋鹿
予麋鹿 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:51

    Writing this here since I don't have enough reputation to comment and edits have to be at least 6 characters. In new versions of Django, you need to pass the path to the view function or the name of the url to the url template tag as a string. Therefore line 7 of above template would be:

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

    Here is the part of the documentation that backs this up.

    0 讨论(0)
  • 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:

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

    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
    0 讨论(0)
提交回复
热议问题