2013-04-17 33 views
11

Tôi đang cố gắng tạo biểu mẫu cho thư viện nơi người dùng có thể thực hiện 2 tác vụ: thêm sách mới hoặc mở thông tin được lưu trữ của một sách hiện có. Sách có 2 trường (tiêu đề và tác giả). Mỗi khi một cuốn sách mới được tạo, nó được lưu trữ tại cơ sở dữ liệu. Bất kỳ cuốn sách nào được tạo trước đây được hiển thị dưới dạng tùy chọn tại danh sách thả xuống (chỉ có tên). Tôi muốn rằng khi người dùng chọn một tùy chọn từ danh sách thả xuống, thông tin của sách đã chọn sẽ xuất hiện trên màn hình.danh sách thả xuống biểu mẫu django của các kiểu được lưu trữ

Tôi đã thử 2 cách tiếp cận khác nhau, nhưng không có cách nào trong số chúng đáp ứng các yêu cầu của tôi. Một mặt, sau câu hỏi này django form dropdown list of numbers tôi có thể tạo ra một danh sách thả xuống, và có được giá trị được lựa chọn tại quan điểm với một số mã như thế:

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

Nhưng tôi muốn lựa chọn của tôi là những cuốn sách được lưu trữ trước đó tại cơ sở dữ liệu và không được xác định trước các giá trị.

Một cách tiếp cận khác mà tôi đã thử là làm điều đó từ mẫu html. Ở đó tôi tạo ra các hình thức sau đây:

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

đâu cuốn sách được hiển thị ở điểm từ này:

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

Trong trường hợp thứ hai này các thông tin hiển thị ở danh sách thả xuống là một trong tôi muốn, nhưng tôi don không biết cách lấy giá trị đã chọn và sử dụng nó ở chế độ xem. Có lẽ sử dụng một hàm javascript?

Vì vậy, 2 yêu cầu của tôi là: hiển thị thông tin chính xác trong danh sách (được lưu trữ tại DB bởi người dùng) và có thể biết cái nào đã được chọn.

Trả lời

27

Bạn nên sử dụng ModelChoiceField.

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

Sau đó, quan điểm của bạn, nó sẽ giống như thế này:

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

Để thêm một cuốn sách mới hoặc chỉnh sửa một, bạn nên sử dụng một ModelForm. Sau đó, theo quan điểm rằng bạn sẽ kiểm tra xem đó là một hình thức mới hay không

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

hoặc

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

Cảm ơn rất nhiều, đó là những gì tôi cần! :) – toni

+0

Làm thế nào để bạn đặt biểu mẫu danh sách thả xuống này trong html, nó có giống với biểu mẫu bình thường không? –

Các vấn đề liên quan