2012-12-22 23 views
12

Yani bir Ajax çağrısı içine bu görünümü dönüm sorunumuz var zaten:Kendi Beğendiğim Düğme: Django + Ajax - Nasıl Yapılır?

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

ben jQuery ve JSON gerektiğini düşünüyorum, ama kendi "düğmesi gibi yapmaya buradan nasıl uygulanacağı emin değilim "Sitem için. Herhangi bir düşünce/öneri?

cevap

24

Size bir örnek vereceğim. Sadece bundan öğreniyor ve buna göre değişiklikler yapıyorsunuz.

myapp.models.py (basitleştirilmiş şirket modeli):

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 (Bir görünümün URL):

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

myapp.views. py (Görünüm):

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

şablonu: Django > 1.3 and < 1.5 ardından eklemek gerekiyorsa bu {% url like %}

  • gibi URL adının etrafında tırnak işaretleri olmadan

    • kullanım Django < 1.3 ise url tag: şablonda url etiketini kullanarak için

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

      Bazı talimatlar {% 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 sonrakaldırmak {% load url from future %} kaldırılacaktır olarak işaretlenir ve yorum yapmak yeterli üne sahip değildir ve düzenlemeler en az 6 karakter olmak zorunda çünkü Django 1.9
  • +1

    Ayrıca, toplam yüklenme sayısını veya sayfa yüklendiğinde "bunu beğendiğinizi" nasıl görüntülerim. GET olmak için ajax türüne ihtiyacım var mı? – jmitchel3

    +0

    bir 'nesnenin tekrarlanamaz' hatası aldığından dolayı, herhangi bir şanstan hoşlanan, oluşturulmuş = Like.objects.create (şirket = şirket) hatası? Ben aynı şeyi yapmaya çalışıyorum ama bu hata var – Algorithmatic

    +0

    'şirket' modeli slug alanı var ..? Bu hatayı alıyorum 'Anahtar kelime' slug 'alanına çözümlenemiyor. Seçenekler şunlardır: içerik, creation_date, id, benzeri, başlık, kullanıcı, user_id' –

    7

    burada bu Yazma kaldırılacaktır olarak tırnak 10 ve kapalı URL ismi. Django'nun yeni sürümlerinde, görünüm işlevine giden yolu veya URL'nin URL'sinin adını bir dize olarak iletmeniz gerekir. Dolayısıyla yukarıdaki şablonun hat 7 olacaktır:

    İşte
    url: "{% url 'like' %}", 
    

    bu yedekler o documentation bir parçasıdır.

    İlgili konular