2017-04-09 2 views
0

Ich versuche, eine Seite zu erstellen, die mehrere Formulare enthält, und ich möchte etwas wie eine "Like-Schaltfläche" erstellen, so dass ich einige Posts auf einer Seite "mögen" kann. Ich möchte auch einige Einschränkungen setzen, damit ich jeden Beitrag mögen kann, aber nur jeden Beitrag einmal mögen kannDjango csrf Token beim Posten mehrerer Formulare

Jetzt stoße ich auf ein Problem, dass ich nur einen Beitrag "mögen" kann. Wenn ich auf einen anderen Eintrag "Gefällt mir" klicke, würde der Fehler csrf auftreten (die CSRF-Überprüfung ist fehlgeschlagen. Die Anfrage wurde abgebrochen.). Ich möchte wissen, wie man mehrere Beiträge auf einer Seite gleichzeitig mag.

Hat es etwas damit zu tun, wie und wo {% csrf_token%} zu setzen? Dieser Artikel (How Will the Inclusion of Two Forms Affect my CSRF Token Use?) sagt, ich sollte {% csrf_token%} in jede Form bringen, aber es scheint nicht zu funktionieren.

Hier ist mein 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()) 

Antwort

0

Änderung

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

zu

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

Danke für die Anregung, aber was, wenn ich will etwas Beschränkung setzen, so dass ich jeden Pfosten mag, kann aber nur wie jeder Post einmal? – CYH16

+0

Seine andere Logik. Sie müssen speichern, welcher Benutzer wie welcher Beitrag. Du musst das bauen – itzMEonTV

+0

Danke. Ich werde daran arbeiten / – CYH16