Python 如何指定表单中字段的顺序?[django脆皮食品]
我们将Django 2.1用于。我们有一个联系表格,最近它被垃圾邮件发送者用来向我们发送垃圾邮件。我决定在表单中添加一个no_bots字段,试图阻止bots成功提交表单。我检查了表单,它工作了,但问题是我们有两个站点-在一个站点Speedy Net上,字段的顺序是正确的,而在另一个站点Speedy Match上,字段的顺序是不正确的-no_bots字段位于消息字段之前,但我希望它是最后一个字段。我怎样才能坚持到最后?我们的模板标记只包含{%crispy form%},我定义了Meta类中字段的顺序: 顺便说一下,我检查了我们的暂存服务器,结果正好相反——字段的顺序在Speedy Match中是正确的,但在Speedy Net中不正确。这很奇怪,因为它们都使用相同的代码!我认为这意味着这些字段的顺序是随机的Python 如何指定表单中字段的顺序?[django脆皮食品],python,django,django-crispy-forms,Python,Django,Django Crispy Forms,我们将Django 2.1用于。我们有一个联系表格,最近它被垃圾邮件发送者用来向我们发送垃圾邮件。我决定在表单中添加一个no_bots字段,试图阻止bots成功提交表单。我检查了表单,它工作了,但问题是我们有两个站点-在一个站点Speedy Net上,字段的顺序是正确的,而在另一个站点Speedy Match上,字段的顺序是不正确的-no_bots字段位于消息字段之前,但我希望它是最后一个字段。我怎样才能坚持到最后?我们的模板标记只包含{%crispy form%},我定义了Meta类中字段的顺
更新:我删除了生产服务器上的所有*.pyc文件,现在两个站点中的字段顺序都正确了。我还删除了登台服务器上的这些文件,现在两个站点中的字段顺序都不正确。我在登台服务器上再次执行此操作,其中一个站点中的字段顺序再次更改。是否尝试使用布局方法 从文件中:
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Fieldset, ButtonHolder, Submit
class ExampleForm(forms.Form):
[...]
def __init__(self, *args, **kwargs):
super(ExampleForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset(
'first arg is the legend of the fieldset',
'like_website',
'favorite_number',
'favorite_color',
'favorite_food',
'notes'
),
ButtonHolder(
Submit('submit', 'Submit', css_class='button white')
)
原因:对无序集合进行迭代
crispy_forms的FormHelper.render_布局执行以下操作:
fields=setform.fields.keys
左\u字段\u到\u渲染=字段-form.rendered\u字段
对于左\u字段中的字段\u到\u渲染:
...
此时,left_fields_to_render是一个集合:{'text','no_bots'}
集合是无序的集合
这有时返回False:[a代表{'text','no_bots'}]中的a]=['text','no_bots']
您可以通过打开几个不同的Python解释器实例来尝试这一点——我注意到它通常在Python解释器实例中是一致的
修复方法:迭代列表
基本上:
字段=tupleform.fields.keys
左\u字段\u到\u呈现=列出\u不同字段,form.rendered\u字段
对于左\u字段中的字段\u到\u渲染:
...
我已经提交了一个公关更完整的修复在
解决方法:明确指定布局中的字段
可以说,如果不将render_unmonted_fields设置为True,则布局的预期用途是正确的
您已经为四个字段中的两个调用self.helper.add_布局;你可以一直走下去:
self.helper.add_layoutMultiWidgetField
一行
Div'sender_name',css_class='col-md-6',
“发件人电子邮件”分区,css_class='col-md-6',
,
“文本”,
“没有机器人”,
您是否可以添加模板代码,以显示如何在模板中呈现表单。@Rohit它只是{%crispy form%}您的想法不错,但我希望使用默认布局。如果生成的HTML与默认布局相同,我不介意添加布局。按原样添加代码会在同一行中添加所有字段,这不是我想要的。我试过了,但是我找不到如何专门添加布局来生成我想要的HTML。这是字段顺序正确时表单的HTML:
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Fieldset, ButtonHolder, Submit
class ExampleForm(forms.Form):
[...]
def __init__(self, *args, **kwargs):
super(ExampleForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset(
'first arg is the legend of the fieldset',
'like_website',
'favorite_number',
'favorite_color',
'favorite_food',
'notes'
),
ButtonHolder(
Submit('submit', 'Submit', css_class='button white')
)