2009-07-30 24 views
5

Tôi có một biểu mẫu Django với một số trường trong đó một trong số đó cần được lặp lại n lần (trong đó n không biết tại thời điểm thiết kế). (nếu có thể)?Django - Lặp lại một trường mẫu n lần theo một dạng

ví dụ: thay vì: -

Class PaymentsForm(forms.form): 
    invoice = forms.CharField(widget=ValueHiddenInput()) 
    total = forms.CharField(widget=ValueHiddenInput()) 
    item_name_1 = forms.CharField(widget=ValueHiddenInput()) 
    item_name_2 = forms.CharField(widget=ValueHiddenInput()) 
    . 
    . 
    . 
    item_name_n = forms.CharField(widget=ValueHiddenInput()) 

tôi cần một cái gì đó như: -

Class PaymentsForm(forms.form): 
    invoice = forms.CharField(widget=ValueHiddenInput()) 
    total = forms.CharField(widget=ValueHiddenInput()) 
    item_name[n] = forms.CharField(widget=ValueHiddenInput()) 

Cảm ơn,
Richard.

Trả lời

8

Bạn có thể tạo các lĩnh vực lặp đi lặp lại trong phương pháp __init__ của mẫu của bạn:

class PaymentsForm(forms.Form): 
    invoice = forms.CharField(widget=forms.HiddenInput()) 
    total = forms.CharField(widget=forms.HiddenInput()) 

    def __init__(self, *args, **kwargs): 
     super(PaymentsForm, self).__init__(*args, **kwargs) 
     for i in xrange(10): 
      self.fields['item_name_%d' % i] = forms.CharField(widget=forms.HiddenInput()) 

Thông tin thêm về các hình thức năng động có thể được tìm thấy ví dụ here

chỉnh sửa: để trả lời câu hỏi trong bình luận của bạn: chỉ cần cung cấp cho số lần lặp lại như một cuộc tranh cãi với phương pháp __init__, một cái gì đó như thế này:

def __init__(self, repetitions, *args, **kwargs): 
     super(PaymentsForm, self).__init__(*args, **kwargs) 
     for i in xrange(repetitions): 
      self.fields['item_name_%d' % i] = forms.CharField(widget=forms.HiddenInput()) 

và sau đó theo quan điểm của bạn (hoặc bất cứ nơi nào bạn tạo biểu mẫu):

payments_form = PaymentsForm(10) 
+0

OK có vẻ thú vị, làm thế nào tôi có thể chuyển giá trị xrange (n) vào lớp khi tôi tạo một thể hiện của biểu mẫu? - (Đoán tôi cần để có được bản thân mình một số cuốn sách python :)) – Frozenskys

+0

Điều này làm việc, nhưng tôi muốn khuyên bạn nên tách ra "n lần" trường thành một đối tượng Form riêng biệt và sử dụng một Formset, như trong câu trả lời của Daniel Roseman. –

+0

Tôi đã thực hiện theo cách này trong một số trường hợp :) – Jiaaro

4

Sử dụng formsets.

+2

các biểu mẫu lặp lại mô hình nhiều lần, không phải trường. – priestc

+0

Làm cách nào điều này có hiệu quả nếu tôi có các giá trị khác trong biểu mẫu chỉ nên được lặp lại một lần? Tôi đã chỉnh sửa câu hỏi để hiển thị điều này. – Frozenskys

+0

+1 Đây là giải pháp sạch hơn so với việc thêm các trường bổ sung trong phương thức __init__. Hãy nhớ rằng một biểu mẫu HTML không cần phải là một đối tượng Biểu mẫu Django duy nhất, nó có thể là nhiều đối tượng Biểu mẫu. Trong trường hợp này, bạn sẽ sử dụng một Biểu mẫu cho tất cả các trường chỉ dùng một lần, và sau đó một Biểu mẫu khác chứa (các) trường lặp lại - đó là Biểu mẫu thứ hai mà bạn sẽ sử dụng trong một Formset. Đây là lý do tại sao Formets tồn tại. –

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