Python 如何指定表单中字段的顺序?[django脆皮食品]

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类中字段的顺

我们将Django 2.1用于。我们有一个联系表格,最近它被垃圾邮件发送者用来向我们发送垃圾邮件。我决定在表单中添加一个no_bots字段,试图阻止bots成功提交表单。我检查了表单,它工作了,但问题是我们有两个站点-在一个站点Speedy Net上,字段的顺序是正确的,而在另一个站点Speedy Match上,字段的顺序是不正确的-no_bots字段位于消息字段之前,但我希望它是最后一个字段。我怎样才能坚持到最后?我们的模板标记只包含{%crispy form%},我定义了Meta类中字段的顺序:

顺便说一下,我检查了我们的暂存服务器,结果正好相反——字段的顺序在Speedy Match中是正确的,但在Speedy Net中不正确。这很奇怪,因为它们都使用相同的代码!我认为这意味着这些字段的顺序是随机的


更新:我删除了生产服务器上的所有*.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')
            )