Django自定义小部件渲染

时间:2018-09-24 07:13:22

标签: django django-forms django-widget

一般问题

假设您有一个特定的模型

class MyModel(models.Model):
    Name = models.CharField(max_length=64)

以及用于创建的伴奏表单

class CreateMyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['name']

通常情况下,在模板中呈现表单时我通常在模板中的字段上循环

{%for field in form%}
{{field}}
{%endfor%}

当需要自定义样式时,我通常不得不求助于将<div><span>放入该循环中,并在{{ 1}}子类。

在主题上浏览Django Documentation时,我了解到好像必须使用attrs子类才能使所有操作都在{的Meta属性中进行{1}},但我只是无法将其包裹住。

特定问题

假设我有一个模板,其中Media表单需要呈现as in this template

widgets

如何创建窗口小部件,以便可以通过使用以下命令获得相同的结果:

Meta

我知道可以在TextInput的{​​{1}}初始化中放入占位符,但是插件(或本例中的父div)不是或至少不我的知识

很抱歉我想问一个很长的问题,我只是觉得我需要彻底解释这个问题,因为它困扰了我一段时间了……

1 个答案:

答案 0 :(得分:2)

我们可以像下面这样

小部件

from django import forms
from django.template import loader
from django.utils.safestring import mark_safe


class MyWidget(forms.Widget):
    template_name = 'widget_template.html'

    def get_context(self, name, value, attrs=None):
        return {'widget': {
            'name': name,
            'value': value,
        }}

    def render(self, name, value, attrs=None):
        context = self.get_context(name, value, attrs)
        template = loader.get_template(self.template_name).render(context)
        return mark_safe(template)

widget_template.html

<div class="form-group input-group">
    <span class="input-group-addon">Name</span>
        <input type="text" class="form-control" id="mywidget-{{ widget.name }}" name="{{ widget.name }}" />
</div>