2012-12-22 6 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') 

テンプレート:テンプレートにurlタグを使用するための

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

一部の命令:

  • Django > 1.3 and < 1.5もしこの{% url like %}
  • のようなURL名の前後に引用符なしDjango < 1.3使用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
  • Django >= 1.5の場合は、は廃止されるようにマークされていると私はコメントするのに十分な評判を持っていないと編集は少なくとも6つの文字でなければならないので、Django 1.9
+1

また、ページが読み込まれたときに、「あなたのお気に入り」の総数を表示するにはどうすればよいですか。私はAJAX型をGETする必要がありますか? – jmitchel3

+0

好きなので、オブジェクト= iterable is not iterableエラーが発生しました= Like.objects.create(company = company)は万一ですか?私は同じことをしようとしているが、私はこのエラーがある – Algorithmatic

+0

'会社'モデルはスラグフィールドを持って..?このエラーが発生しました。 'キーワード' slug 'をフィールドに解決できません。 –

7

がここにこれを書くに削除されるように引用符で10と囲まれたURL名。 Djangoの新しいバージョンでは、ビュー関数へのパスまたはurlテンプレートタグへのURLの名前を文字列として渡す必要があります。したがって、上記のテンプレートの7行目は次のようになります。ここでは

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

これをバックアップdocumentationの一部です。

関連する問題