2009-06-01 28 views
44

Tôi đang cố gắng để prepopulate dữ liệu trong hình thức django của tôi dựa trên một số thông tin, nhưng không sử dụng ModelForm, vì vậy tôi không thể chỉ cần thiết lập dụ.Prepopulate Django (không Model) Form

Điều này có vẻ như nó thực sự dễ dàng, nhưng vì lý do nào đó tôi không thể tìm thấy bất kỳ tài liệu nào cho tôi biết cách thực hiện điều này. Đây là hình thức của tôi:

class MyForm(forms.Form): 
    charfield1 = forms.CharField(max_length=3) 
    charfield2 = forms.CharField(max_length=3) 
    choicefield = forms.ModelChoiceField(MyModel.objects.all()) 

Tôi đã cố gắng chỉ thực hiện:

form = MyForm() 
form.charfield1 = "foo" 
form.charfield2 = "bar" 
# a model choice field 
form.choicefield = MyModel.objects.get(id=3) 

mà không hoạt động.

Trả lời

79

Hãy thử:

form = MyForm({'charfield1': 'foo', 'charfield2': 'bar'}) 

Các constructor của Form đối tượng có thể lấy một cuốn từ điển các giá trị trường. Điều này tạo ra một hình thức ràng buộc, có thể được sử dụng để xác nhận hợp lệ dữ liệu và hiển thị biểu mẫu dưới dạng HTML với dữ liệu được hiển thị. Xem tài liệu the forms API để biết thêm chi tiết.

Edit:

Vì lợi ích của sự hoàn chỉnh, nếu bạn không muốn để ràng buộc hình thức, và bạn chỉ muốn khai báo giá trị ban đầu cho một số lĩnh vực, bạn có thể sử dụng sau đây thay vì:

form = MyForm(initial={'charfield1': 'foo', 'charfield2': 'bar'}) 

Xem tài liệu của initial values để biết chi tiết.

+0

cảm ơn - làm việc này. Tuy nhiên, nó không hoạt động với khóa ngoài cho một mô hình. Tôi đã cố gắng vượt qua trong trường hợp mô hình chính nó trong từ điển, mà ném một ngoại lệ, và tôi đã cố gắng đi qua trong pk/id, mà không thất bại, nhưng không tải trước nó một cách chính xác trong giao diện người dùng mẫu của tôi. – Cory

+0

Sử dụng id đối tượng sẽ hoạt động. Tôi vừa thử nghiệm nó với một ModelChoiceField. Bạn có thể vui lòng cho chúng tôi biết định nghĩa biểu mẫu của bạn không? –

+0

đã thêm định nghĩa biểu mẫu trong bản chỉnh sửa. – Cory

23

Có hai cách để điền vào biểu mẫu Django.

Cách đầu tiên là chuyển từ điển làm đối số đầu tiên khi bạn thực hiện nó (hoặc chuyển nó làm data kwarg, điều tương tự). Đây là những gì bạn làm khi bạn muốn sử dụng dữ liệu POST để điền và xác thực biểu mẫu.

data_dict = {'charfield1': 'data1', 'charfield2': 'data2', 'choicefield': 3} 
form = MyForm(data_dict) 

Tuy nhiên, điều này sẽ kích hoạt xác nhận về hình thức, vì vậy chỉ có tác dụng nếu bạn đang thực sự đi qua trong dữ liệu hợp lệ và đầy đủ để bắt đầu với - nếu không bạn sẽ bắt đầu với lỗi.

Cách khác để điền biểu mẫu là sử dụng thông số initial (được ghi là here). Điều này cung cấp các giá trị ban đầu cho các trường biểu mẫu, nhưng không không kích hoạt xác thực. Do đó, nó phù hợp nếu bạn không điền vào tất cả các giá trị, ví dụ.

form = MyForm(initial=data_dict) 

Để điền một trường chọn qua initial, hãy sử dụng giá trị pk.

+0

Dựa trên những điều trên, bạn cung cấp dữ liệu cho các trường biểu mẫu khách hàng như thế nào? – Chris

+0

@Chris, nếu bạn có câu hỏi và không được đề cập ở trên, vui lòng mở một câu hỏi mới và hỏi ở đó, với đầy đủ chi tiết. –

+0

Đó là một câu hỏi phụ liên quan đến câu trả lời này. – Chris

12

Bạn có thể sử dụng model_to_dict() để chuyển đổi một cá thể thành từ điển và sau đó điền một biểu mẫu với từ đó. Một cái gì đó như thế này nên làm việc:

from django.forms.models import model_to_dict 
... 
my_obj = MyModel.objects.get(abc=123) 
form = MyForm(initial=model_to_dict(my_obj)) 

Lưu ý: Tôi đang sử dụng django phiên bản 1.3

1

Đối với những gì nó có giá trị, các FormView lớp dựa trên quan điểm cách để làm điều này sẽ được ghi đè 's get_initialFormView chức năng.get_initial trả lại các đối số từ khóa ban đầu được sử dụng bởi get_form_kwargs để khởi tạo biểu mẫu.

Documents:

  • cho get_initial, here,
  • cho get_form_kwargs, here.

Mẫu mã:

from django.views.generic.edit import FormView 

class MyFormView(FormView): 

    def get_initial(self): 
     initial = super(MyFormView, self).get_initial() 
     # update initial field defaults with custom set default values: 
     initial.update({'charfield1': 'foo', 'charfield2': 'bar'}) 
     return initial 
Các vấn đề liên quan