4

我正在使用django-crispy-forms在django中呈现模型的形式。django-crispy-forms 已经很好地与Twitter Bootstrap集成,并为小部件定义了一个布局对象AppendedText

附加文本小部件

我的 django 中有以下模型models.py

class Historia(models.Model):
    persona         = models.ForeignKey('Persona', 
                                  blank=False, 
                                  null=True,
                                  related_name='historias')
    fecha           = models.DateTimeField(unique=True, 
                                auto_now_add=True)
    motivo          = models.TextField()
    peso            = models.DecimalField(blank=True,
                                   max_digits=5, decimal_places=2)
    talla           = models.IntegerField(blank=True)
    tension         = models.CharField(max_length=15)
    pulso           = models.IntegerField()
    diagnostico     = models.TextField()
    tratamiento     = models.TextField()
    pendiente       = models.TextField(blank=True)

modelform我在中定义以下内容forms.py

class HistoriaForm(django.forms.ModelForm):
    class Meta:
        model = models.Historia

    def __init__(self, *args, **kwargs):
        super(HistoriaForm, self).__init__(*args, **kwargs)

        self.helper = FormHelper(self)
        self.helper.form_class = 'form-horizontal'
        self.helper.form_tag = True
        self.helper.form_id = 'nueva_historia_form'
        self.helper.form_action = 'nueva_historia'

        self.helper.form_show_errors = True
        self.helper.error_text_inline = False

        self.helper.add_input(Submit('crear', 'Crear'))

我的问题是如何更改peso字段的小部件而无需创建新的widget子类,因为django-crispy-forms已经定义了一个布局对象。另请注意,我不想枚举所有其他字段以便这样做:

self.helper.layout = Layout(
            Fieldset(
                'Legend',
                'nombre',
                'apellido',
                AppendedText('peso', 'kg')
            ),
            ButtonHolder(
                Submit('submit', 'Submit', css_class='button white')
            )
        )

因为如果我决定在我的模型中添加标准小部件已经非常有用的新字段,我将不得不继续编辑帮助程序布局。

编辑:我还看到了在帮助器中访问布局的方法,self.helper.layout[0] = AppendedText('peso', 'kg')但我不知道我想更改的字段的索引,如果我能写会更好self.helper.layout['peso'] = AppendedText('peso', 'kg')

4

2 回答 2

6

django-crispy-forms 确实有用于这些事情的 API:http: //django-crispy-forms.readthedocs.org/en/latest/dynamic_layouts.html

你可以简单地做:

form.helper['peso'].wrap(AppendedText, "kg")
于 2013-03-24T17:10:32.883 回答
2

好的,这对我有用,而不必过于冗长并保持简单。在该__init__方法中,只需执行以下操作:

for i, field in enumerate(self.helper.layout):
    if field == 'peso':
        self.helper.layout[i] = AppendedText('peso', 'kg')

如果您要查找的字段位于layout对象的第一级层次结构中,则此方法非常有效,否则您必须更具体地了解您要查找的内容。例如,如果您的字段位于DIV容器中,您将首先必须检查是否field.__class__ == DIV然后反省该DIV字段,这并不像看起来那么容易。

layout但是,如果有对象的 API 来支持过滤器查询,那就太好了

于 2013-03-17T14:40:33.510 回答