0

我想添加一个自定义字段,它可以提供额外的属性来处理模板中的单个输出。例如这是我的课:

class CustomField(CharField):
    suffix = "things"

以及我field.html添加field.suffix块的地方:

<div class="controlGroup clearfix {% if field.errors %}error{% endif %}">
   <label class="controlLabel" for="{{ field.auto_id }}">{{ field.label }}</label>
   <div class="controls">
       {{ field }}
       {% if field.suffix %}
           <span class="suffix">{{ field.suffix }}</span>
       {% endif %}
       {% if field.errors %}
           <span class="helpInline">{{ field.errors }}</span>
       {% endif %}
   </div>
</div> 

不幸的是,后缀块根本不输出。

编辑:为了澄清,下面的两个当前答案都针对添加小部件属性。我实际上是在尝试添加一个自定义字符串以在模板中使用,而不是自定义 CSS 类。

4

3 回答 3

0

对于您的简单示例,您可以覆盖用于表单字段的小部件的attrs字典,您不需要创建自定义字段。

class YourForm(forms.Form):
  some_field = forms.CharField(widget=forms.TextInput(attrs={'class': 'suffix'})

如果你真的想创建一个自定义字段,你需要创建一个自定义小部件并控制render方法。根据您要呈现的表单控件类型,您可以从 django 提供的等效控件继承自定义小部件。

于 2012-09-10T08:03:25.727 回答
0

属性可以通过两种方式传递给表单字段。我在下面给出了示例代码。

class ArticleForm(forms.ModelForm):
    class Meta:
        model = MyModel
        widgets = {
            'field1' : forms.TextInput(attrs = {'class': 'suffix'}),
            'field2' : forms.TextInput(attrs = {'class': 'suffix'}),
        }

或者

class ArticleForm(forms.ModelForm):
    class Meta:
        model = MyModel

    def __init__(self, *args, **kw):
        super(forms.ModelForm, self).__init__(*args, **kw)
        self.fields['field1'].widget.attrs['class'] = 'suffix'
        self.fields['field2'].widget.attrs['class'] = 'suffix'

您可以使用第一个示例中给出的小部件,也可以使用第二个示例中给出的init小部件。两者都会起作用。

编辑:任何属性都可以使用上面的示例传递给 django 表单字段。

于 2012-09-10T08:25:25.847 回答
0

我最终通过创建自己的小部件来做到这一点:

class UsernameInput(TextInput):
    """
    Creates a widget specifically for appending the username suffix as a label
    """  9 
    def render(self, name, value, attrs=None):
        widget = super(UsernameInput, self).render(name, value, attrs)
        widget += u'<span class="field-suffix">@%s</span>' % USERNAME_DOMAIN_PART
        return mark_safe(widget)

然后在我的注册表单中指定小部件,如下所示:

username = forms.EmailField(label="Preferred Username",
                            widget=UsernameInput(),
                            error_messages={'invalid': "Please enter a valid email address"})
于 2012-09-11T10:33:02.400 回答