2017-04-09 3 views
0

J'essaie de créer une page qui comprend plusieurs formulaires, et je veux construire quelque chose comme un "bouton j'aime" afin que je puisse "aimer" certains messages dans une page. Je veux également mettre une restriction pour que je puisse aimer chaque poste, mais ne peut aimer chaque poste une foisDjango jeton csrf lors de la publication de plusieurs formulaires

Maintenant, je rencontre un problème que je ne peux "aimer" un poste. Lorsque je clique sur un autre "like" à un autre poste, une erreur csrf se produirait (vérification CSRF échouée. Je veux savoir comment aimer plusieurs articles dans une page en même temps.

Cela a-t-il quelque chose à voir avec comment et où mettre {% csrf_token%}? Cet article (How Will the Inclusion of Two Forms Affect my CSRF Token Use?) dit que je devrais mettre {% csrf_token%} sous toutes les formes, mais cela ne semble pas fonctionner.

Voici mon code:

models.py

class Restaurant(models.Model): 
    name = models.CharField(max_length=20) 
    phone_number = models.CharField(max_length=15) 
    address = models.CharField(max_length=50, blank=True) 
    likes = models.DecimalField(max_digits=2,decimal_places=0, default=0) 

views.py

<!doctype html> 
<html> 
<head> 
    <title> Menu </title> 
    <meta charset='utf-8'> 
</head> 
<body> 
    <h2>餐廳列表</h2> 

    <table> 
     <tr> 
      <th>ID</th> 
      <th>NAME</th> 
      <th>PHONE</th> 
      <th>ADDRESS</th> 
      <th>LIKES</th> 
      <th>LIKE IT!</th> 
     </tr> 
     {% for r in restaurants %} 
      <tr> 
       <td> {{ r.id }} </td> 
       <td> {{ r.name }} </td> 
       <td> {{ r.phone_number }} </td> 
       <td> {{ r.address }} </td> 
       <td> {{ r.likes }} </td> 
       <td> 
       <form id={{ r.id }} action="" method="post"> 
        {% csrf_token %} 
        <input type="hidden" name="ok" value="yes"> 
        <input class="submit" type="submit" value="Upvote"> 
       </form> 
       </td> 

      </tr> 
     {% endfor %} 
    </table> 

    </form> 
</body> 
</html> 

views.py

def list_restaurants(request): 
    restaurants = Restaurant.objects.all() 

    if request.method == "POST": 
     post = Restaurant.objects.get(id=request.POST['id']) 
     post.likes += 1 
     post.save() 
     return render_to_response('restaurants_list.html',locals()) 
    else: 
     return render(request, 'restaurants_list.html',locals()) 

Répondre

0

changement

return render_to_response('restaurants_list.html',locals()) 

à

return render(request, 'restaurants_list.html',locals()) 
+0

Merci pour la suggestion, mais si je veux mettre une certaine restriction afin que je puisse aimer chaque poste, mais ne peut que chaque poste une fois? – CYH16

+0

Son autre logique. Vous devez enregistrer quel utilisateur comme quel poste. Vous devez construire cela – itzMEonTV

+0

Merci. Je vais y travailler / – CYH16