django - 如何使用字符串覆盖表单文本框小部件?

时间:2011-10-26 21:17:48

标签: django django-templates

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)

我这样设置的原因如下:

  • 尝试使用单个模板处理两种表单
  • 有时只想验证PasswordForm字段,其他时候都要验证UserForm和PasswordForm字段,因此有两种形式
  • 在模板中,有时希望将名称显示为文本框输入,有时则只显示名称值的字符串(即不可编辑)

我以为我可以在模板中循环播放以下内容

 {{ 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))) 

1 个答案:

答案 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" />

即。用户将能够看到,但不能编辑它。