2011-01-14 33 views
6

Tất cả các ví dụ hình thức web.py có định dạng sau (từ webpy.org):Cách điền động hộp chọn/hộp thả xuống trong biểu mẫu bằng cách sử dụng web.py?

myform = form.Form( 
    form.Textbox("boe"), 
    form.Textbox("bax", 
     form.notnull, 
     form.regexp('\d+', 'Must be a digit'), 
     form.Validator('Must be more than 5', lambda x:int(x)>5)), 
    form.Textarea('moe'), 
    form.Checkbox('curly'), 
    form.Dropdown('french', ['mustard', 'fries', 'wine'])) 

class index: 
    def GET(self): 
     form = myform() 
     # make sure you create a copy of the form by calling it (line above) 
     # Otherwise changes will appear globally 
     return render.formtest(form) 

    def POST(self): 
     form = myform() 
     if not form.validates(): 
      return render.formtest(form) 
     else: 
      # form.d.boe and form['boe'].value are equivalent ways of 
      # extracting the validated arguments from the form. 
      return "Grrreat success! boe: %s, bax: %s" % (form.d.boe, form['bax'].value) 

Tôi không muốn để điền vào hộp thả xuống (form.Dropdown trong ví dụ trên) tĩnh khi tuyên bố biểu mẫu, nhưng trong phương thức GET/POST sử dụng các mục được lấy ra từ một bảng cơ sở dữ liệu khi trang được gọi.

tôi đã tìm kiếm một vài giờ nhưng không thể tìm thấy một gợi ý bất cứ nơi nào (google, webpy.org, nhóm google)

Trả lời

2

tôi đề nghị bạn tạo ra các yếu tố khác và các hình thức, sau đó trong GET/POST tạo các yếu tố thả xuống như bạn muốn và:

# Create copy of the form 
form = myform() 

# Append the dropdown to the form elements. 
form.inputs = tuple(list(form.inputs) + [mydropdown]) 
+2

Tôi không nghĩ rằng nó là tốt để vá đầu vào của hình thức trong trường hợp này (nhưng nó có thể có ích trong một số tình huống khác). Đối với trường hợp cụ thể này, tôi đề nghị tạo 'Dropdown' với' args = [] 'và sau đó thiết lập' args' của trình đơn thả xuống trong bản sao của biểu mẫu. –

3

tôi biết điều này đã được đăng trong một thời gian trước, nhưng tôi đã làm điều này bằng cách thiết lập các giá trị sau đó, như trong:

form = input_form() 
form.get('some_input').value = _id 
return render.some_template(form) 

này cho phép bạn sử dụng được xác thực tích hợp nếu bạn muốn. Tôi đã kết thúc tìm một ví dụ như thế này trên bảng, vì vậy nó có thể là loại tài liệu chôn vùi khôn ngoan.

4

Bạn có thể khai báo biểu mẫu bằng cách chuyển danh sách trống sang form.Dropdown args và sau đó đặt args trong mã của bạn.

# form declaration 
MyForm = form.Form(form.Dropdown("french", [])) 

# then in your controller 
my_form = MyForm() 
my_form.french.args = ['mustard', 'fries', 'wine'] 

Cũng xin đừng sử dụng form cho biến, vì tên cuộc đụng độ với web.form.

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