2010-03-24 33 views
6

Thư viện biểu mẫu của Django có tính năng của các bộ biểu mẫu cho phép bạn xử lý các biểu mẫu được thêm động. Ví dụ: bạn sẽ sử dụng bộ biểu mẫu nếu ứng dụng của bạn có danh sách dấu trang, bạn có thể sử dụng bộ biểu mẫu để xử lý nhiều biểu mẫu mà mỗi trang biểu thị một dấu trang.Lưu trữ trường động ở dạng Django

Còn nếu bạn muốn tự động thêm trường vào biểu mẫu? Một ví dụ sẽ là trang tạo khảo sát nơi bạn có thể tự động thêm số câu hỏi không giới hạn. Làm thế nào để bạn xử lý này trong Django?

Trả lời

7

Nhìn vào bài gần đây này bởi Jacob Kaplan-Moss, một trong những người sáng lập ban đầu của Django: "Dynamic form generation". Nó sử dụng một ví dụ để chỉ cho bạn quá trình từng bước. Tuyệt vời đọc.

Ngoài ra còn có a 2008 article by James Bennett, người quản lý phát hành của Django.

5

Để thêm, xóa và thay đổi lĩnh vực trên một Form hoặc ModelForm, chỉ cần ghi đè __init__() như thế này:

class MyForm(forms.Form): 
def __init__(self, *args, **kwargs): 
    user = kwargs.pop('user') 
    other_stuff = kwargs.pop('stuff') 

    super(MyForm, self).__init__(*args, **kwargs) 

    self.fields['my_dynamic_field'] = forms.Field(...) 

    # Add fields based on user or other_stuff 

Và sử dụng nó như thế này: form = MyForm(user = user, stuff = stuff)

+0

Lưu ý: Tôi không thể gửi kwarg của người dùng tới siêu __init__; tăng "__init __() đã nhận được đối số từ khóa không mong muốn 'người dùng'" – ecdani

+0

Giải quyết: kwargs.pop phải đến trước siêu cuộc gọi – ecdani

5

Trong python bạn có thể tạo một lớp động. Knutin cho thấy một ví dụ tốt về tùy chỉnh động một biểu mẫu dựa trên và thêm một vài trường.

Bạn cũng có thể tạo ra cả hình thức tự động, như lấy từ example given by James Bennett:

def make_contact_form(user): 
    fields = { 'name': forms.CharField(max_length=50), 
      'email': forms.EmailField(), 
      'message': forms.CharField(widget=forms.Textarea) } 
    if not user.is_authenticated(): 
    fields['captcha'] = CaptchaField() 
    return type('ContactForm', (forms.BaseForm,), { 'base_fields': fields }) 
Các vấn đề liên quan