2013-04-17 13 views
11

Próbuję utworzyć formularz dla biblioteki, w której użytkownik może wykonać 2 czynności: dodać nową książkę lub otworzyć zapisane informacje o istniejącej. Książki mają 2 pola (tytuł i autor). Za każdym razem, gdy tworzona jest nowa książka, jest ona przechowywana w bazie danych. Każda poprzednio utworzona książka jest wyświetlana jako opcja na liście rozwijanej (tylko nazwa). Chcę, aby kiedy użytkownik wybierze opcję z rozwijanej listy, informacja o wybranej książce pojawi się na ekranie.Lista rozwijana Django formularza przechowywanych modeli

Próbowałem 2 różnych podejść, ale żaden z nich nie spełnia moich wymagań. Z jednej strony, po tym pytaniu django form dropdown list of numbers jestem w stanie utworzyć listę rozwijaną i uzyskać wybraną wartość w widokach z kodem tak:

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') 

ale chcę moje opcje być wcześniej zapisane książek w baza danych, a nie predefiniowane wartości.

Inne podejście, które próbowałem, to zrobić z szablonu html. Nie mogę utworzyć następującą postać:

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

Gdzie książka staje się widokami z tego:

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

W tym drugim przypadku informacje wyświetlane na liście rozwijanej jest jeden, którego chcę, ale ja don wiesz, jak uzyskać wybraną wartość i użyć jej w widokach. Być może używając funkcji javascript?

Moje 2 wymagania to: pokaż prawidłowe informacje na liście (przechowywane w DB przez użytkownika) i być w stanie wiedzieć, który został wybrany.

Odpowiedz

27

Powinieneś użyć ModelChoiceField.

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

Wtedy twoje poglądy, powinno to wyglądać mniej więcej tak:

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, 
    }) 

Aby dodać nową książkę lub edytować jeden, należy użyć ModelForm. Następnie w tym widoku możesz sprawdzić, czy jest to nowa forma czy nie

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

lub

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

Wielkie dzięki, że to, co potrzebne! :) – toni

+0

Jak umieścić tę rozwijaną listę w html, czy jest taka sama jak zwykłe formularze? –

Powiązane problemy