2012-12-22 37 views
12

所以我一直有麻煩將這一觀點爲Ajax調用:我自己喜歡的按鈕:Django + 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,但我不知道如何實現它在這裏做我自己「喜歡按鈕「爲我的網站。任何想法/建議?

回答

24

我會給你一個例子。你只是從中學習並相應地做出改變。

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

模板:

  • 如果Django < 1.3使用url標籤不帶引號周圍的網址名稱這樣{% url like %}
  • 如果Django > 1.3 and < 1.5就應該添加:

    <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標籤模板一些指令{% 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 %}和封閉的網址名稱以作爲{% load url from future %}被標記爲被棄用,並將在Django 1.9
+1

此外,當頁面加載時,我將如何顯示喜歡的總數或「你喜歡這個」。我需要ajax類型是GET嗎? – jmitchel3

+0

你是否因爲喜歡,創建了= Like.objects.create(company = company)這個'對象不可迭代'錯誤?我試圖做同樣的事情,但我得到了這個錯誤 – Algorithmatic

+0

是'公司'模型有slug字段..?我收到此錯誤'無法解析關鍵字'slug'到字段中。選擇是:content,creation_date,id,like,title,user,user_id' –

7

寫這這裏,因爲我沒有足夠的信譽評論和編輯都必須至少6個字符被刪除引號。在Django的新版本中,您需要將路徑傳遞給視圖函數或將url的名稱作爲字符串傳遞給url模板標記。因此上面的模板第7行是:

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

這裏是documentation部分實現此了。