2012-12-22 14 views
12

Così ho avuto difficoltà a trasformare questa visione in una chiamata Ajax:Pulsante Mi Piace personale: Django + Ajax - Come?

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

Penso di aver bisogno jQuery e JSON, ma non sono sicuro di come implementarlo qui per fare il mio "pulsante mi piace "per il mio sito. Qualche idea/suggerimento?

risposta

24

Ti darò un esempio. Devi solo imparare da esso e apportare le modifiche di conseguenza.

myapp.models.py (modello semplificato società):

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 per una vista):

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

myapp.views. py (Visualizza):

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

Il modello:

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

Alcune istruzioni per l'uso del url tag nel modello:

  • Se Django < 1.3 uso url tag senza virgolette intorno al nome URL come questo {% url like %}
  • Se Django > 1.3 and < 1.5 allora si dovrebbe aggiungere {% load url from future %} at top level of your template and enclosed your URL name with quotes as I have done in my answer
  • Se Django >= 1.5 è sufficiente rimuovere {% load url from future %} e il nome URL racchiuso tra virgolette come {% load url from future %} è contrassegnato da essere deprecato e sarà rimosso in Django 1.9
+1

Inoltre, come dovrei visualizzare il numero totale di Mi piace o "ti piace" quando viene caricata la pagina. Ho bisogno che il tipo ajax sia GET? – jmitchel3

+0

stai ottenendo un errore 'object is not itable' a causa del piaciuto, creato = Like.objects.create (company = company) per caso? Sto cercando di fare la stessa cosa ma ho ricevuto questo errore – Algorithmatic

+0

il modello 'company' ha un campo di lumaca ..? Sto ottenendo questo errore 'Impossibile risolvere la parola chiave 'slug' nel campo. Le scelte sono: content, creation_date, id, like, title, user, user_id' –

7

Scrivendo questo qui dal momento che non hanno abbastanza reputazione di commentare e modifiche devono essere di almeno 6 caratteri. Nelle nuove versioni di Django, devi passare il percorso alla funzione di visualizzazione o il nome dell'URL al tag del modello di URL come stringa. Pertanto la linea 7 del sopra template sarebbe:

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

Ecco la parte del documentation che esegue questo in su.

Problemi correlati