【发布时间】:2019-02-27 16:01:17
【问题描述】:
一般问题
假设你有一个特定的模型
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>s 和<span>s 放在该循环中,并在Meta 子类中指定基本小部件及其attrs。
浏览该主题的Django Documentation,我知道似乎我必须使用Media 子类才能使所有操作都发生在Meta 的widgets 属性中,但我只是我无法理解它。
具体问题
假设我有一个模板,其中TextInput 表单需要呈现as in this template:
<div class="form-group input-group">
<span class="input-group-addon">Name</span>
<input type="text" name="name" class="form-control" placeholder="MyModel Name">
</div>
如何创建一个小部件,以便我可以通过以下方式获得相同的结果:
class CreateMyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['name']
widgets={'name':MyWidget(addon="Name",placeholder="MyModel Name")}
我知道占位符是我可以放在 TextInput 的 attrs 初始化中的东西,但插件(或父 div,在这种情况下)不是 或者至少据我所知不是 em>
我很抱歉问了一个很长的问题,我只是觉得我需要彻底解释这个问题,因为它已经困扰了我一段时间......
【问题讨论】:
-
in
addon="Name", Name 应该在 span 内吧? -
@VaibhavVishal 不,你可以找到渲染的表单here,我正在尝试在“输入组”部分中渲染字段
-
你必须在 for 循环中手动创建 div 和 span,你可以使用
{{ field.label }}将文本动态放入 span 中 -
@VaibhavVishal 这就是我迄今为止一直在做的事情,在企业应用程序中跟踪大量 HTML 会让人感到沮丧。我希望这里有人有更好的解决方案!
-
有很多方法可以做你想做的事,但这需要入侵 django,它们只会让你的代码更加复杂。
标签: django django-forms django-widget