我正在使用Twitter Bootstrap和Django来渲染表单.
Bootstrap可以很好地格式化你的表单 - 只要你有CSS它期望包含的类.
但是,我的问题是Django生成的表单{{ form.as_p }}不能很好地与Bootstrap一起呈现,因为它们没有这些类.
例如,Django的输出:
<form class="horizontal-form" action="/contact/" method="post">
<div style='display:none'>
<input type='hidden' name='csrfmiddlewaretoken'
value='26c39ab41e38cf6061367750ea8c2ea8'/>
</div>
<p><label for="id_name">Name:</label> <input id="id_name" type="text" name="name" value="FOOBAR" maxlength="20" /></p>
<p><label for="id_directory">Directory:</label> <input id="id_directory" type="text" name="directory" value="FOOBAR" maxlength="60" /></p>
<p><label for="id_comment">Comment:</label> <textarea id="id_comment" rows="10" cols="40" name="comment">Lorem ipsum dolor sic amet.</textarea></p>
<p>
<label for="id_server">Server:</label>
<select name="server" id="id_server">
<option value="">---------</option>
<option value="1"
selected="selected">sydeqexcd01.au.db.com</option>
<option value="2">server1</option>
<option value="3">server2</option>
<option value="4">server3</option>
</select>
</p>
<input type="submit" value="Submit" />
</form> …Run Code Online (Sandbox Code Playgroud) 我正在遍历表单的字段,对于某些字段,我想要稍微不同的布局,需要更改HTML.
要准确地做到这一点,我只需要知道小部件类型.它的类名或类似的东西.在标准的python中,这很容易!field.field.widget.__class__.__name__
不幸的是,您不允许访问模板中的下划线变量.大!
您可以测试,field.field.widget.input_type但这仅适用于文本/密码<input ../>类型.我需要更多的解决方案.
对我而言,无论它看起来多么困难,最适合在模板级别执行此操作.我已经将处理字段HTML的代码外包给了一个单独的模板,该模板包含在字段循环中.这意味着它在ModelForms和标准Forms 之间是一致的(如果我写了一个中间的Form类,这是不正确的).
如果您能看到一种不需要我编辑20多种形式的通用方法,请告诉我!
我害怕的另一个基本问题是我正在努力.我已经浏览了各种Django文档页面并搜索了这个网站.我在这里找到的唯一一件事是在2013年,它建议设置一个自定义过滤器模板.
无论如何,我正在尝试生成自己的表单,而不是使用Django自己的方式通过{{form}}生成它.这很简单,所以我可以控制表单的呈现方式.
我已经找到了各种方法来访问所需的信息,例如(在我的for form for form循环中);
我正在尝试识别项目类型,以便我可以使用正确的输入类型,但是我正在努力锻炼item.xxxx应该是什么.由于这是通过{{form}}正确显示的,我假设这些信息在表单中的某处可用,只是努力找出如何访问它,以便我可以识别正确的输入类型.我正在手动执行此操作,因此我可以使用正确的Bootstrap样式来显示输入字段.
任何帮助将被赞赏(或只是指向正确的方向).我对此非常陌生,因此对我的基本问题表示道歉,如果不知道有人我就可以去问这些问题.
问候
韦恩
不确定你是否需要它,但这里有一些代码;
形成:
class NewsForm(ModelForm):
class Meta:
model = News_Article
exclude = ('news_datetime_submitted', 'news_yearmonth', )
labels = {
'news_title': _('Enter News Title'),
}
help_texts = {
'news_title': _('Enter a title to give a short description of what the news is.'),
}
error_messages = {
'news_title': {
'max_length': _("News title is too long."),
},
}
Run Code Online (Sandbox Code Playgroud)
查看(还没有在POST位上工作,这就是Django文档中的内容,POST是我接下来需要解决的问题)
def create(request, dataset):
if dataset not in ['news', 'announcement']:
return HttpResponseRedirect(reverse('pages'))
rDict = …Run Code Online (Sandbox Code Playgroud)