django和python还是比较新的......
我已经定义了两种形式如下:
class PasswordForm(forms.Form):
def __init__(self, *args, **kwargs):
self.name={'label':'Name', 'data':''}
def get_name(self):
return self.name['data']
def set_name(self, name):
self.name['data'] = name
name = property(get_name, set_name)
pass1 = forms.CharField(max_length=20)
pass2 = forms.CharField(max_length=20)
class UserForm(PasswordForm):
name = forms.CharField(max_length=20)
我这样设置的原因如下:
我以为我可以在模板中循环播放以下内容
{{ form.field.label }} {{ form.field }}
最终发生的事情是开发服务器很难崩溃(即'python manage.py runserver') - 没有错误消息,只是退出。
显然,我做错了什么,但不知道是什么。是否可以使用字符串覆盖文本框输入,使模板更明智?如果是这样,我该怎么做呢?
感谢您的帮助!
W上。
修改 根据Pasty Legs的回答,要做的是覆盖使用的小部件。对widgets.py中的语法进行了一些调整,以便它适用于我:
from django.forms import widgets
from django.utils.safestring import mark_safe
class StringWidget(widgets.Input):
def render(self, name, value, attrs=None):
# Create a hidden field first
hidden_field = widgets.HiddenInput(attrs)
return mark_safe(u'%s %s' % (value, hidden_field.render(value, attrs)))
答案 0 :(得分:3)
为什么不使用禁用的输入而不是尝试替换它?
http://reference.sitepoint.com/html/input/disabled
class MyForm(forms.ModelForm):
apple = models.CharField(widget=forms.TextInput(attrs={'disabled':'disabled'}))
如果您需要动态决定是否将输入设置为禁用(而不是上面总是禁用它),您可以覆盖构造
class MyForm(forms.ModelForm):
apple = models.CharField(widget=forms.TextInput())
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
if something:
self.fields['apple'].widget.attrs["disabled"] = 'disabled'
修改强> 要使字段显示为字符串,您需要覆盖窗口小部件(即用于显示该窗体域的HTML)。问题是如果你没有在某种表单元素中包含文本,它将在表单提交时丢失。解决此问题的最简单方法是创建一个自定义窗口小部件,将字符串和字符串显示为隐藏的输入文本字段:
创建一个小部件.py:
from django.forms import widgets
class StringWidget(widgets.Input):
def render(self, name, value, attrs=None):
# Create a hidden field first
hidden_field = widgets.HiddenField(attrs)
return mark_safe(u'<p>%s</p>%s' % (value, hidden_field.render(value, attrs))
forms.py
from myapp.widgets import StringWidget
class MyForm(forms.ModelForm):
apple = models.CharField(widget=StringWidget())
当你循环遍历模板时,会产生类似下面的内容:
<p>granny smith</p>
<input type="hidden" class="..." name="id_apple" value="granny smith" />
即。用户将能够看到,但不能编辑它。