2011-06-23 76 views
5

我想重新使用模板我有我的WTForms形式:WTForms - display屬性值,而不是HTML場

<th>${form.name.label}</th> 
<td>${form.name()}</td> 
... 

不過,我的編輯頁面上,我想輸入字段顯示爲正常(TextField,SelectField等),而在我的查看頁面上,我只想顯示屬性的值,而不是輸入字段的值。

編輯頁:

<th>Name:</th> 
<td><input type="text" value="Current Name" name="name" id="name"/></td> 

查看網頁:

<th>Name:</th> 
<td>Current Name</td> 

我知道我可以通過form.name.data訪問一個字段的值,但有什麼辦法,我可以保持與form.name()相同的模板被稱爲並以某種方式切換是否輸出<input type="text"...Current Name

回答

6

我創建了一個自定義部件:

from wtforms.fields import Field 

class PlainTextWidget(object): 
    def __call__(self, field, **kwargs): 
     return field.data if field.data else '' 

然後,我的視圖頁上,我增加了以下內容:

form = MyForm(obj=myDataRow) 
fields = [val for val in form._fields] 
for fieldName in fields: 
    fieldProp = getattr(form, fieldName) 
    setattr(fieldProp, 'widget', PlainTextWidget()) 
3

莎拉的回答上面使我解決一個相關的問題:是什麼如果你想讓一些字段只能被讀取?在這種情況下,您可以定義一個新的ROTextField變體,而不是在表單對象上進行運行時手術,它總是呈現爲純粹的值。例如:

from wtforms.widgets import Input 
from wtforms.fields import StringField 

class TextOutput(Input): 
    def __call__(self, field, **kwargs): 
     return kwargs.get('value', field._value()) 

class ROTextField(StringField): 
    widget = TextOutput() 

現在定義字段只讀屬性:

class UserPrefs(Form): 
    name  = ROTextField('name', default='Jon') 
    # ... 

對這個問題的思考幫助我更好地瞭解如何WTForms工作。如果這可能會幫助其他人解決相關問題,請將其留在此處。

1

根據Sarah的回答和WTForms-Components中的代碼,我使用以下命令將表單的所有字段快速轉換爲只讀和禁用字段。

假設我們有定義爲ProfileForm如下:

class ProfileEditForm(Form): 
    title = StringField("Title", validators=[validators.required("Please enter your title.")]) 
    first_name = StringField("First Name", validators=[validators.required("Please enter your first name.")]) 
    middle_name = StringField("Middle Name") 
    last_name = StringField("Last Name", validators=[validators.required("Please enter your last name.")]) 
    organisation = StringField("Company Name", validators=[validators.required("Please enter your company name.")]) 
    organisation_website = StringField("Company Website") 
    # more fields ... 

定義下面的類(基於ReadOnlyWidgetProxy從WTForms組件):

class ReadOnlyAndDisabledWidgetProxy(object): 
    def __init__(self, widget): 
     self.widget = widget 

    def __getattr__(self, name): 
     return getattr(self.widget, name) 

    def __call__(self, field, **kwargs): 
     kwargs.setdefault('readonly', True) 
     kwargs.setdefault('disabled', True) 
     return self.widget(field, **kwargs) 

現在從ProfileForm繼承如下:

class ReadOnlyProfileForm(ProfileForm): 
    def __init__(self, *args, **kwargs): 
     super(ReadOnlyProfileForm, self).__init__(*args, **kwargs) 
     for field_name in self._fields: 
      field_property = getattr(self, field_name) 
      field_property.widget = ReadOnlyAndDisabledWidgetProxy(field_property.widget)