在Django中無論何種field,都有一個widget的屬性:
1 class Field(object): 2 widget = TextInput # Default widget to use when rendering this type of Field. 3 hidden_widget = HiddenInput # Default widget to use when rendering this as "hidden".
如上所示,widget默認是TextInput。
而TextInput是一個繼承Input的一個類:
1 class TextInput(Input): 2 input_type = 'text' 3 4 def __init__(self, attrs=None): 5 if attrs is not None: 6 self.input_type = attrs.pop('type', self.input_type) 7 super(TextInput, self).__init__(attrs)
html option屬性。往上接著找,Input繼承于Widget,不同于Widget的是它有個input_type。當繼承Input時需要指明input_type,像上面的TextInput一樣指明為'text',類似的,PasswordInput則將其指明為'password'。
1 class Widget(six.with_metaclass(RenameWidgetMethods)): 2 needs_multipart_form = False # Determines does this widget need multipart form 3 is_localized = False 4 is_required = False 5 supports_microseconds = True 6 7 def __init__(self, attrs=None): 8 if attrs is not None: 9 self.attrs = attrs.copy() 10 else: 11 self.attrs = {}
在Widget中有個attrs的屬性,這個屬性其實可以用來設置對應field的html屬性。這個屬性在Widget的render里會被引用。
所以如果你需要設置某個字段的html屬性時,可以這么做:
1 field = forms.CharField() 2 field.widget.attrs['readonly']='true'
如果是一個這樣的form:
from user.models import User from django import formsclass RegisterForm(forms.ModelForm):class Meta:fields = ('first_name', 'last_name', 'email', 'username',)
form標記的屬性,你需要這樣才能設置field的attrs:
for field in form:field.field.widget.attrs['readonly']='false'
為什么要這樣呢?因為ModelForm的Field是一個BoundField:
1 class BoundField(object): 2 "A Field plus data" 3 def __init__(self, form, field, name): 4 self.form = form 5 self.field = field 6 self.name = name 7 self.html_name = form.add_prefix(name) 8 self.html_initial_name = form.add_initial_prefix(name) 9 self.html_initial_id = form.add_initial_prefix(self.auto_id) 10 if self.field.label is None: 11 self.label = pretty_name(name) 12 else: 13 self.label = self.field.label 14 self.help_text = field.help_text or '' 15 self._initial_value = UNSET
BoundField不像CharField或其他一般的Field,并不是直接繼承于Field。所以當你需要獲得BoundField的Field的對象的時候,需要使用它的field的屬性。
?