2013-04-17 10 views
11

Sto provando a creare un modulo per una libreria in cui un utente può eseguire 2 azioni: aggiungere un nuovo libro o aprire le informazioni memorizzate di uno esistente. I libri hanno 2 campi (titolo e autore). Ogni volta che viene creato un nuovo libro, questo viene archiviato nel database. Qualsiasi libro creato in precedenza viene mostrato come opzione in un elenco a discesa (solo il nome). Voglio che quando un utente seleziona un'opzione dall'elenco a discesa, le informazioni del libro selezionato vengono visualizzate sullo schermo.elenco a discesa modulo django dei modelli memorizzati

Ho provato 2 approcci diversi, ma nessuno di essi soddisfa i miei requisiti. Da un lato, a seguito di questa domanda django form dropdown list of numbers sono in grado di creare un elenco a discesa, e ottenere il valore selezionato in vista con un certo codice del genere:

class CronForm(forms.Form): 
    days = forms.ChoiceField(choices=[(x, x) for x in range(1, 32)]) 

def manage_books(request): 
    d = CronForm() 
    if request.method == 'POST': 
     day = request.POST.get('days') 

Ma voglio le mie opzioni di essere i libri precedentemente registrati il data base e non i valori predefiniti.

Un altro approccio che ho provato è quello di farlo dal modello html. Ci creo il seguente modulo:

<form> 
    {% for book in list %} 
     <option value="name">{{ book.name }}</option> 
    {% endfor %} 
</form> 

Dove libro è reso a vista da questo:

l = Books.objects.all().order_by('name') 

In questo secondo caso le informazioni visualizzate l'elenco a discesa è quello che voglio, ma io don sapere come ottenere il valore selezionato e utilizzarlo nelle visualizzazioni. Forse usando una funzione javascript?

Quindi i miei 2 requisiti sono: mostrare le informazioni corrette nella lista (memorizzate nel DB dall'utente) ed essere in grado di sapere quale è stato selezionato.

risposta

27

È necessario utilizzare ModelChoiceField.

class CronForm(forms.Form): 
    days = forms.ModelChoiceField(queryset=Books.objects.all().order_by('name')) 

Poi vostro punto di vista, dovrebbe essere simile a questa:

def show_book(request): 
    form = CronForm() 
    if request.method == "POST": 
     form = CronForm(request.POST) 
     if form.is_valid: 
     #redirect to the url where you'll process the input 
     return HttpResponseRedirect(...) # insert reverse or url 
    errors = form.errors or None # form not submitted or it has errors 
    return render(request, 'path/to/template.html',{ 
      'form': form, 
      'errors': errors, 
    }) 

Per aggiungere un libro nuovo o modificare uno, è necessario utilizzare un ModelForm. Poi in quella vista si controlla se si tratta di una nuova forma o no

book_form = BookForm() # This will create a new book 

o

book = get_object_or_404(Book, pk=1) 
book_form = BookForm(instance=book) # this will create a form with the data filled of book with id 1 
+1

Grazie mille, che è quello che mi serviva! :) – toni

+0

Come si inserisce questo modulo nell'elenco a discesa in html, è lo stesso dei moduli normali? –

Problemi correlati