2013-05-08 7 views
16

Sono nuovo di Django, ma sto costruendo un sito Web in cui le persone possono rilasciare dichiarazioni su alcuni argomenti discutibili. In questo momento ho appena aggiunto manualmente alcune dichiarazioni per ciascun dibattito e vorrei che gli utenti avessero la possibilità di "votare" su una dichiarazione.Django - Come incrementare il campo intero dall'input dell'utente?

Ecco il codice che ho adesso:

Codice da models.py

class Debate(models.Model): 
    title = models.CharField(max_length=50) 
    description = models.CharField(max_length=100) 
    pub_date = models.DateTimeField('Date Published') 
    url_slug = models.SlugField(editable=False) 
    def __unicode__(self): 
     return self.title 

class Statement(models.Model): 
    statement = models.CharField(max_length=200) 
    debate = models.ForeignKey(Debate) 
    votes = models.IntegerField(default=0) 
    user = models.ForeignKey(User) 
    def __unicode__(self): 
     return self.statement 

Codice da views.py

def debate_page(request, url_slug): 
    if request.method == 'POST': 
     for statement in statements: 
      statement.votes = statement.votes+1 

    debate = Debate.objects.get(url_slug=url_slug) 
    template = get_template('debate_page.html') 
    statements = Statement.objects.filter(debate=debate) 

    variables = Context ({ 
     'debate_title': debate.title, 
     'debate_description': debate.description, 
     'statements': statements, 
    }) 

    output = template.render(variables) 
    return HttpResponse(output) 

Codice da modello

{% extends "base.html" %} 
{% block title %}{{ debate_title }}{% endblock %} 
{% block head %}{{ debate_title }}{% endblock %} 
{% block description %}{{ debate_description }}{% endblock %} 
{% block content %} 
     {% for statement in statements %} 
      <li>{{ statement }} - {{ statement.votes }} 
      <input type="checkbox" name="statement" value="{{ statement.id }}" /></li><br /> 
     {% endfor %} 
     <input type="submit" value="Submit" />  
{% endblock %} 

Così quello che mi piacerebbe è per un visitatore di selezionare una casella accanto alla dichiarazione con cui sono d'accordo e quindi fare clic sul pulsante di invio. Fare ciò aumenterebbe l'attributo voti per la dichiarazione di 1. Non riesco proprio a capire come ottenere input da parte dell'utente e apportare una modifica al database.

Grazie!

+0

https://docs.djangoproject.com/en/dev/ref/request-response/ l'oggetto di richiesta di Django detiene i dati post in un oggetto simile a un dizionario. Lo useresti per ottenere i dati del post. L'incremento si otterrebbe importando il modello appropriato e aumentando il numero dei voti di 1 – jsvk

+2

Mi dispiace, ma sono nuovo di Django e anche se la tua risposta potrebbe essere utile ad alcuni, non capisco come fare ciò che disse. – emagdnim

risposta

2

è possibile ottenere l'input dell'utente con

statements = request.POST.getlist('statement') 

Da tale elenco, è possibile aumentare il valore del tuo voto e aggiornamento del database come

for st in statements: 
    statement = Statement.objects.get(id=st) 
    statement.vote += 1 
    statement.save() 

Spero che questo ti aiuta. Codice

+4

Ciò comporterà molte query SQL, in cui la soluzione di Matt verrà eseguita in una singola query. Il dopo non è solo più veloce, ma più sicuro. – codingjoe

+7

Questo codice ha anche una condizione di competizione e NON deve essere usato. – tuomassalo

+2

Grazie per i commenti! Prenderò nota – kyiphyu

34

di kyiphyu può essere ulteriormente semplificata utilizzando espressioni F:

from django.db.models import F 

Statement.objects.filter(id__in=statements).update(vote=F('vote') + 1) 
Problemi correlati