2014-06-19 3 views
6

본인은 사용자가 주문서를 작성할 수있는 주문서를 가지고 있습니다. 주문은 (producetype, quantity)의 여러 개의 튜플로 구성됩니다. Producetype은 <select> 형식으로 렌더링되어야하며 수량은 입력 일 수 있습니다. producetype의 선택 사항은 변경 될 수 있기 때문에 동적으로 추가되어야합니다. 현재, 나는 벌거 벗은 HTMLWTForm : SelectField가있는 FieldList, 어떻게 렌더링합니까?

enter image description here

내가 WTForm 정말 내 코드를 단순화하기 때문에 이것에 대한 WTForm을 사용하고자이 서면으로 작성했습니다. 그러나, 나는 그렇게 할 수 없습니까 :

코드 :

class OrderEntryForm(Form): 
    quantity = IntegerField('Quantity', 
          [validators.Required(), validators.NumberRange(min=1)]) 
    # we will be dynamically adding choices 
    producetype = SelectField('Produce', 
          [validators.Required()], 
          choices=[]) 

class OrderForm(Form): 
    name = TextField('Crop', [validators.Length(min=3, max=60)]) 
    due_date = DateField('Due Date', [validators.required()]) 
    order_entries = FieldList(FormField(OrderEntryForm)) 

나는 다음과 같은 질문이 있습니다

  1. 어떻게 동적으로 OrderForm의 order_entries 분야에 선택을 추가 할 수 있습니까?
  2. 주문 번호가 order = { name:hello, due_date:2014-06-18, order_entries:[ {producetype_id: 1, quantity: 2}, {producetype_id: 3, quantity: 4}] } 인 경우 어떻게 OrderFormOrderEntryForm 값을 채울 수 있습니까?

내 코드는 여기에 있습니다 : https://gist.github.com/vicngtor/f8c8f0519dbd6b3b6110

답변

-1

OrderForm에에 SubmitField을 추가

submit_something = SubmitField((u'Add something')) 

다음보기에서 호출하고, FieldListappend_entry 방법을 사용

if form.submit_something.data: 
     form.order_entries.append_entry() 
     return render_template('yourtemplate.html', form=form) 

희망 하시겠습니까?

+0

나는 아무 문제 제출이 없습니다. 나는 문제가 양식을 prepopulating있다 (신중하게 질문을 읽어주세요) – disappearedng

4

당신이 후 렌더링 폼에 라인 항목을 추가 할 의미하는 경우

을 의미 내가 동적이에 따라 달라집니다 OrderForm

의 order_entries 필드에 선택을 추가 할 수있는 방법. DOM 조작을 사용하여 클라이언트 측에 추가해야합니다. WTForms에는 양식 필드의 색인을 지정하는 명명 규칙이 있습니다. 그것의 단지 name="<form-field)name>-<index>". 이 규칙을 따르는 javascript를 사용하여 이름을 추가하면 WTForms은 백엔드에서이를 처리하는 방법을 알게됩니다.

동적 선택 목록이 필요하다면 인스턴스화 된 양식의 FieldList을 반복하면됩니다. choices에 2-tuples의 반복 가능을 할당 할 수 있습니다. 아래의 예제에서 나는 그것들을 직접 할당 할 것이지만 그것들은 스토리지에서 쉽게 검색 될 수 있습니다.

order_form = OrderForm() 
for sub_form in order_form.order_entries: 
    sub_form.producetype.choices = [('2', 'apples'), ('2', 'oranges')] 

방법 올바른 OrderEntryForm 값으로 내 OrderForm을 채울 수 있습니까?

obj 키워드 인수를 사용하여 개체를 양식에 직접 바인딩 할 수 있습니다.WTForms은 개체의 특성에서 양식을 동적으로 작성하기에 충분히 똑똑합니다.

from wtforms import Form, IntegerField, SelectField, TextField, FieldList, FormField 
from wtforms import validators 
from collections import namedtuple 

OrderEntry = namedtuple('OrderEntry', ['quantity', 'producetype']) 
Order = namedtuple('Order', ['name', 'order_entries']) 

class OrderEntryForm(Form): 
    quantity = IntegerField('Quantity', 
          [validators.Required(), validators.NumberRange(min=1)]) 
    # we will be dynamically adding choices 
    producetype = SelectField('Produce', 
          [validators.Required()], 
          choices=[ 
           (1, 'carrots'), 
           (2, 'turnips'), 
          ]) 

class OrderForm(Form): 
    name = TextField('Crop', [validators.Length(min=3, max=60)]) 
    order_entries = FieldList(FormField(OrderEntryForm)) 

# Test Print of just the OrderEntryForm 
o_form = OrderEntryForm() 
print o_form.producetype() 

# Create a test order 
order_entry_1 = OrderEntry(4, 1) 
order_entry_2 = OrderEntry(2, 2) 

order = Order('My First Order', [order_entry_1, order_entry_2]) 

order_form = OrderForm(obj=order) 

print order_form.name 
print order_form.order_entries 

위의 예는 샘플 Order를 만들고 obj 키워드에 공급한다. 에하면이 다음 (스타일이 적용되지 않은)를 생성합니다 렌더링 :

enter image description here

+0

이것은 매우 도움이되었다. 고맙습니다. 그러나 솔루션에 직접 관련된 다른 문제가 있습니다. 당신도 충분히 친절하게 보일 수 있을까요? http://stackoverflow.com/questions/24324161/wtform-how-do-i-tell-form-to-use-a-custom-method-for-one-particular-attribute – disappearedng

관련 문제