2013-06-18 31 views
9

Có cách nào để tạo một lớp biểu mẫu django thực sự chứa một mảng các trường không? Tôi có một cơ sở dữ liệu sẽ kéo lên một số câu hỏi khác nhau để hỏi người dùng và mỗi câu hỏi sẽ biết cách xác định nó là widget ... vv, tôi dường như không thể móc điều này lên các dạng django.Cách tạo danh sách trường theo dạng django

Tôi cố gắng này:

class MyForm(forms.Form): 
    question = [] 
    questions = Question.objects.all() 
    for q in questions: 
     question.append(forms.CharField(max_length=100, label=q.questionText)) 

Nhưng điều này dường như không để lộ danh sách các câu hỏi của tôi khi tôi tạo một đối tượng mới của MyForm. Có cách nào để có được một số biến của các lĩnh vực hình thức bằng cách sử dụng các hình thức django, hoặc là vượt quá phạm vi của những gì nó có thể làm gì?

+0

Bạn đã từng nghĩ về việc sử dụng một mẫu nhà máy với các lớp biểu mẫu? Bạn có thể xử lý bất kỳ số lượng biểu mẫu nào trong chế độ xem, có thể nằm trong danh sách. – Brandon

Trả lời

10

Bạn có thể sử dụng formsets nếu biểu mẫu của bạn giống hệt nhau (bao gồm cả nhãn của chúng). ví dụ.

Câu hỏi: __________________
Câu hỏi: __________________
Câu hỏi: __________________

vv Tôi giả sử mỗi hình thức chỉ chứa một lĩnh vực ở đây (lĩnh vực này 'Câu hỏi'). Có ba dạng trong ví dụ này.


Nếu bạn cần một số năng động của các lĩnh vực trong một hình thức đơn, sau đó bạn có thể sử dụng __init__ để đạt được những gì bạn muốn (lưu ý: đang chưa được kiểm tra):

class MyForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     questions = kwargs.pop('questions') 
     super(MyForm, self).__init__(*args, **kwargs) 
     counter = 1 
     for q in questions: 
      self.fields['question-' + str(counter)] = forms.CharField(label=question) 
      counter += 1 

Và bạn' d tạo mẫu với cái gì đó như:

form = MyForm(questions=your_list_of_questions) 

Bạn sẽ tìm thấy bài viết này hữu ích: http://jacobian.org/writing/dynamic-form-generation/

+0

Bài viết hay, tôi nghĩ rằng 'self.fields [''] =' logic là những gì tôi đã thực sự mất tích (ít nhất là cách dễ nhất để có được từ nơi tôi đến nơi tôi muốn trở thành). Cảm ơn câu trả lời! –

6

Tất nhiên bạn có thể!

class MyForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     for i, q in enumerate(Question.objects.all()): 
      self.fields['%s_field' % i] = forms.CharField(max_length=100, label=q.questionText) 

Lưu ý: chắc chắn rằng câu hỏi của bạn được sắp xếp giữa các cuộc gọi .. như danh sách lĩnh vực sẽ được repopulated khi nộp mẫu đơn, biên lai, vv

Nếu dữ liệu được đặt hàng và tĩnh, nó sẽ không là một vấn đề.

Bạn cũng có thể muốn xem xét FormSet s, một danh sách các biểu mẫu có thể phù hợp hơn trong trường hợp của bạn.

+0

@KevinDiTraglia: Tôi sẽ đi với formets nếu tôi là bạn – marianobianchi

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