【问题标题】:Change the widget of just one field in django-crispy-forms with the layout object AppendedText使用布局对象 AppendedText 更改 django-crispy-forms 中仅一个字段的小部件
【发布时间】:2013-03-05 20:50:55
【问题描述】:

我正在使用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)

我在forms.py 中定义了以下modelform

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

【问题讨论】:

    标签: python django django-crispy-forms


    【解决方案1】:

    django-crispy-forms 确实有一个 API 来处理这些事情: http://django-crispy-forms.readthedocs.org/en/latest/dynamic_layouts.html

    你可以这样做:

    form.helper['peso'].wrap(AppendedText, "kg")
    

    【讨论】:

    • 只需稍加改动即可使用form.helper['peso'].wrap(AppendedText, "peso", "kg")。谢谢!
    • 对不起 Gustavo,但你指出的是一个错误。您不必传递字段的名称。与包装多个字段的其他情况一样,无法为所有字段传递字段名称。这已在此提交github.com/maraujop/django-crispy-forms/commit/… 中得到解决,并将成为crispy-forms 1.2.5 的一部分
    • 它仍然给我一个You need to set a layout in your FormHelper 错误,但我不想这样做,因为我不会为引用布局中的每个字段而烦恼。如果我添加更多字段,我也必须去更改它。
    【解决方案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 来支持过滤器查询,那就太好了

    【讨论】:

      猜你喜欢
      • 2012-06-16
      • 2013-10-19
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 2013-07-21
      • 2012-11-10
      • 1970-01-01
      相关资源
      最近更新 更多