2008-10-22 23 views
17

Nói rằng tôi có một hình thức như:Django Forms - Làm thế nào để sử dụng tiền tố Parameter

class GeneralForm(forms.Form): 
    field1 = forms.IntegerField(required=False) 
    field2 = forms. IntegerField(required=False) 

Và tôi muốn thể hiện nó hai lần trên một trang trong một thẻ hình thức mỗi lần với một tiền tố khác nhau ví dụ ,:

rest of page ... 
<form ..> 
GeneralForm(data,prefix="form1").as_table() 
GeneralForm(data,prefix="form2").as_table() 
<input type="submit" /> 
</form> 
rest of page ... 

Khi người dùng gửi nội dung này, làm cách nào để tôi nhận biểu mẫu đã gửi trở lại thành hai biểu mẫu riêng biệt để xác thực và hiển thị lại biểu mẫu?

This was the only documentation Tôi có thể tìm thấy và nó rất đáng sợ.

Trả lời

31

Bạn xử lý từng biểu mẫu như bình thường, đảm bảo rằng bạn tạo các cá thể có cùng tiền tố giống như các tiền tố được sử dụng để tạo biểu mẫu ban đầu.

Dưới đây là một ví dụ hơi vụng về sử dụng biểu mẫu bạn đã đưa ra, như tôi không biết những gì các trường hợp sử dụng chính xác là:

def some_view(request): 
    if request.method == 'POST': 
     form1 = GeneralForm(request.POST, prefix='form1') 
     form2 = GeneralForm(request.POST, prefix='form2') 
     if all([form1.is_valid(), form2.is_valid()]): 
      pass # Do stuff with the forms 
    else: 
     form1 = GeneralForm(prefix='form1') 
     form2 = GeneralForm(prefix='form2') 
    return render_to_response('some_template.html', { 
     'form1': form1, 
     'form2': form2, 
    }) 

Dưới đây là một số mẫu mã thực tế đó cho thấy các hình thức xử lý bằng cách sử dụng tiền tố:

http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/

+0

Cảm ơn, đó chính xác là những gì tôi đang tìm kiếm! – Greg

5

Thậm chí tốt hơn, tôi nghĩ formsets là chính xác những gì bạn đang tìm kiếm.

class GeneralForm(forms.Form): 
    field1 = forms.IntegerField(required=False) 
    field2 = forms. IntegerField(required=False) 

from django.forms.formsets import formset_factory 

# GeneralSet is a formset with 2 occurrences of GeneralForm 
# (as a formset allows the user to add new items, this enforces 
# 2 fixed items, no less, no more) 
GeneralSet = formset_factory(GeneralForm, extra=2, max_num=2) 

# example view 

def someview(request): 
    general_set = GeneralSet(request.POST) 
    if general_set.is_valid(): 
     for form in general_set.forms: 
      # do something with data 
    return render_to_response("template.html", {'form': general_set}, RequestContext(request)) 

Bạn thậm chí có thể có một bộ định dạng được tạo tự động từ mô hình với modelformset_factory, được quản trị viên django tự động sử dụng. FormSet xử lý nhiều thứ hơn các biểu mẫu đơn giản, như thêm, xóa và sắp xếp các mục.

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