假设您有一个特定的模型
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)不是或至少不我的知识
很抱歉我想问一个很长的问题,我只是觉得我需要彻底解释这个问题,因为它困扰了我一段时间了……
答案 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)
<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>