2016-05-11 10 views
-1

Ich versuche Benutzern die Möglichkeit zu geben, Objekte zu mögen/nicht zu mögen (mit Ajax) und Seitenaufrufe zu zählen. Ich habe Funktionen geschrieben und die Vorlagen geändert, aber irgendwo liegt ein Fehler. Das Ergebnis von Likes und Views ist immer 0. Es scheint mir, dass der Fehler in den views.py-Funktionen liegt, aber vielleicht liege ich falsch, ich bin ein Anfänger in Django. Nun ist es gemäß den Funktionen einem Benutzer möglich, ein Objekt mehr als einmal zu mögen. Ich möchte den Benutzer dazu bringen, dies nicht zu tun, sondern ihm die Fähigkeit zu geben, das Objekt nicht zu mögen. Aber zuerst möchte ich zumindest ein einfaches richtig funktionieren. Zuerst habe ich versucht, die Anzahl der Besuche der Nutzerseite zu zählen und Likes für das Model Day hinzuzufügen. Können Sie mir bitte sagen, wie ich meine Dateien korrigieren kann?Fügen Sie Likes und Seitenaufrufe zu Django Projekt hinzu

Dies ist ein Teil der Ansicht ist:

@login_required 
def like_day(request): 

    day_id = None 

    if request.method == 'GET': 
     if 'day_id' in request.GET: 
      day_id = request.GET['day_id'] 

      likes = 0 
      if day_id: 
       day = Day.objects.get(id=int(day_id)) 
       if day: 
        likes = day.likes + 1 
        day.likes = likes 
        day.save() 
      return HttpResponse(likes) 

def track_url(request): 
person_id = None 
url = '/friends_plans/users/' 
if request.method == 'GET': 
    if 'person_id' in request.GET: 
     person_id = request.GET['person_id'] 
     try: 
      person = Person.objects.get(id=person_id) 
      person.views = person.views + 1 
      person.save() 
      url = person.url 
     except: 
      pass 

return redirect(url) 

Diese list.html sind

{% extends 'friends_plans/base.html' %} 
{% load staticfiles %} 
    {% block title %} Users {% endblock %} 

    {% block content %} 
     <div id ="left"> 
      <div id="toptitle"> Friends' Plans members:</div> 
      <table class="table"> 
        <thead> 
         <tr> 
         <th>Photo</th> 
         <th>Name</th> 
         <th>Occupation</th> 
         <th>Days</th> 
         <th>Places</th> 
         <th>Wiews</th> 
         </tr> 
        </thead> 
        <tbody> 
        {% for person in users %} 
         <tr> 
         <td><span> <img class="small_cat" src={% static 'images/cat3.jpg' %} /> </span></td> 
         <td><a href="{% url 'friends_plans:user' person.pk %}">{{ person.username|upper }}</a></span></td> 
         <td><span>Student at {{ person.place_of_work_or_study}}</span></td> 
         <td>{{person.day_set.all.count}}</td> 
         <td>{{person.wish_list_set.all.count}}</td> 
         <td>{{person.wish_list.comment_to_wish_list_set.all.count}}</td> 
         <td>{% if person.views >= 0 %} 
           {{person.views}} views 
           {% elif person.views == 1 %} 
           {{person.views}} view 
          {% endif %} 
         </td> 
         </tr> 
        {% endfor %} 
        </tbody> 
        </table> 
      <div class="pagination"> 
       <div id="listing"> 
        <span class="step-links"> 
         {% if users.has_previous %} 
          <a href="?page={{ users.previous_page_number }}">previous</a> 
         {% endif %} 

         <span class="current"> 
          Page {{ users.number }} of {{ users.paginator.num_pages }}. 
         </span> 

         {% if users.has_next %} 
          <a href="?page={{ users.next_page_number }}">next</a> 
         {% endif %} 
        </span> 
       </div> 
      </div> 
     </div> 
    {% endblock %} 

Diese day.html (es muss für jeden Benutzer eine Anzahl der Seitenaufrufe sein) ist (es gibt eine Schaltfläche dort)

<!DOCTYPE html> 
{% load staticfiles %} 

<html > 
<head> 
    <title> {{person.username}} </title> 
    <meta charset ="utf -8" /> 
    <link rel="stylesheet" href="{% static 'css/style_day.css' %}"> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"> </script> 
    <script src="{% static 'js/friends_plans-jquery.js' %}"></script> 
    <script src="{% static 'js/friends_plans-ajax.js' %}"></script> 
</head> 
<body> 
    <div id ="container"> 
     <div id ="header"> 
      <ul id ="menu"> 
       <span><a href ="" >Friends' Plans</a></span> 
       <span><a href ="{% url 'friends_plans:user' request.user.pk %}" >My Page</a></span> 
       <span><a href ="{% url 'friends_plans:listing' %}" >Users</a></span> 
       <span><a id="helpbutton" href ="" >HELP</a></span> 
      </ul> 
     </div> 
     <div id ="left"> 
      <div id="border"> 
       <div><a class="button" href="{% url 'friends_plans:user' person.pk %}">{{person.username}}</a></div> 
       <img class="cat" src={% static 'images/cat5.jpg' %} /> 
      </div> 
      <div id="info"> 
       <div class ="name"> {{person.email}} </div> 
       <div class ="name"> {{person.phone_number}} </div> 
       <div class ="name"> Student of {{person.place_of_work_or_study}} </div> 
      </div> 
      <div id="empty"> </div> 

     </div> 
     <div id ="right"> 
      <div class="sep"> 
       <div class="title"> {{person}}'s plans for {{day}}: </div> 
       <div class="value"> Status: {{day.level_of_business}} </div> 
       {% for event in day.event_set.all %} 
       <div class="title1"> <a class="button" href ="">Business: {{event.business}}</a></div> 
       <div class="title1"> Type: {{event.type}}</div> 
       <div class="title1"> Period of time: {{event.start_time}}-{{event.end_time}}</div> <br /> 
       {% endfor %} 
      </div> 
      <p> 
       <strong id="like_count">{{ day.likes }}</strong> users like this day 
       {% if user.is_authenticated %} 
       <button id="likes" data-catid="{{day.id}}" class="btn btn-primary" type="button"> 
        <span class="glyphicon glyphicon-thumbs-up"></span> 
        Like 
       </button> 
       {% endif %} 
      </p> 
      <div> 
      {% if person.id == request.user.id %} 
       <a href="{% url 'friends_plans:add_event' person.pk day.pk %}">Add event</a> 
      {% endif %} 
      </div> 
     </div> 
     <div id ="footer"> Copyright </div> 
    </div> 
</body> 
</html> 

Und das ist ajax-Datei:

$('#likes').click(functin()){ 
var catid; 
catid = $(this).attr("data-catid"); 
$.get('/friends_plans/like_day/', {day_id: catid}, function(data){ 
    $('#like_count').html(data); 
    $('#likes').hide(); 
}); 
}); 

Und das sind meine Modelle, Person:

class Person (AbstractUser): 
phone_number = models.CharField(max_length=30) 
place_of_work_or_study = models.CharField(max_length=100) 
img = models.ImageField(upload_to='photos/', null=True, blank=True) 
url = models.URLField(null=True, blank=True) 
views = models.IntegerField(default=0) 
class Meta: 
    verbose_name = 'Person' 
    verbose_name_plural = 'Users' 
def __unicode__(self): 
    return self.username 

And Day:

class Day(models.Model): 
person = models.ManyToManyField(Person) 
date = models.DateField() 
url = models.URLField(null=True, blank=True) 
views = models.IntegerField(default=0) 
likes = models.IntegerField(default=0) 
levels = (
    ('busy', 'busy'), 
    ('has_suggestions', 'has_suggestions'), 
    ('waiting_for_suggestions', 'waiting_for_suggestions') 
) 
level_of_business = models.CharField(choices=levels, max_length=40, default='waiting_for_suggestions') 
def __unicode__(self): 
    return unicode(self.date) 

Antwort

0

Die Syntax des Codes AJAX ist nicht korrekt. Es sollte

$('#likes').click(function(){ 
    var catid; 
    catid = $(this).attr("data-catid"); 
    $.get('/friends_plans/like_day/', {day_id: catid}, function(data){ 
     $('#like_count').html(data); 
     $('#likes').hide(); 
    }); 
}); 

Des Weiteren ist, beachten Sie bitte, dass Sie sollten nicht Verwendung GET, um Daten auf dem Server zu manipulieren. Dies kann durch CSRF attacks missbraucht werden. Verwenden Sie stattdessen POST.
Wenn Sie POST verwenden, sollten Sie nicht vergessen, ein csrf-Token in der Vorlage zu generieren und es zusammen mit der Anfrage entweder als X-Header oder in einem Cookie zu senden.

+0

Vielen Dank! Aber es hat nicht geholfen, es gibt immer noch 0 für den Tag. Ich denke, dass es einen Fehler in meinen Funktionen gibt, da es das gleiche Problem für Besuche von Zählseiten gibt und ich AJAX in diesem Fall nicht verwende. –

0

Die Lösung für das Problem bestand darin, $(document).ready(function(){}) zu AJAX-Anforderung hinzuzufügen.

Verwandte Themen