django 表单设置字段顺序

标签 django forms field

我正在尝试设置表单的字段顺序。但不知何故,它只是按字母顺序排列。有人有一些建议吗?我试过 class Meta: fields = ["field", "field"] 并在 init 中添加一个 keyOrder

形式:

class HangarFilterForm(forms.Form):

    FIELDS = [
        ("", ""),
        ("warp", "Warp"),
        ("cargo_space", "Cargo Space"),
        ("smuggle_bay", "Smuggle Bay"),
        ("dock", "Dock/Undock"),
        ("enter_warp", "Enter Warp"),
        ("fuel_bay", "Fuel Bay"),
        ("fuel_cost", "Fuel Cost"),
    ]

    PER_PAGE = [
        (10, ""),
        (5, "5 ships"),
        (10, "10 ships"),
        (25, "25 ships"),
        (50, "50 ships"),
    ]

    field_1 = forms.ChoiceField(choices=FIELDS, label="1st attribute", required=False)
    field_2 = forms.ChoiceField(choices=FIELDS, label="2nd attribute", required=False)
    per_page = forms.ChoiceField(choices=PER_PAGE, required=False)

    def __init__(self, *args, **kwargs):
        super(HangarFilterForm, self).__init__(*args, **kwargs)
        self.fields['planet'] = forms.ChoiceField(
                        choices=[("", "")] + [ (o.id, o.name) for o in    lanet.objects.all().order_by("name")], 
                        required=False)
        self.fields['type'] = forms.ChoiceField(
                        choices=[("", "")] + [ (o[0], o[1]) for o in ShipTemplate.SHIP_TYPES], required=False)
        self.fields.keyOrder = ["planet", "type", "field_1", "field_2", "per_page"]

最佳答案

这是我过去为重新排列有效表单中的字段顺序而完成的一些代码;您可能可以将其放入 mixin 以在其他地方使用。让我知道事情的后续。

from django.utils.datastructures import SortedDict


class HangarFilterForm(forms.Form):

    ordered_field_names = ['planet', 'type', 'field_1', 'field_2', 'per_page']

    def __init__(self, *args, **kwargs):
        super(HangarFilterForm, self).__init__(*args, **kwargs)
        # Your field initialisation code
        self.rearrange_field_order()

    def rearrange_field_order(self):

        original_fields = self.fields
        new_fields = SortedDict()

        for field_name in self.ordered_field_names:
            field = original_fields.get(field_name)
            if field:
                new_fields[field_name] = field

        self.fields = new_fields

如果您出于某种原因想跟踪原始文件顺序,您只需将 original_fields 中的 self.original_fields 更改为 rearrange_field_order 即可。

关于django 表单设置字段顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27555411/

相关文章:

c - 挣扎于 C 字符串和 printf %s

python - 需要 Django 1.2 速成类

python - Django:将 NullBooleanField 显示为 Radio,默认为 None

php - 如何使用输入重定向回表单 - Laravel 5

jquery - 如何根据是否选中来设置复选框标签内的 DIV 样式?

java - 有没有办法用方法初始化静态字段?

python - 如何将不相关模型的查询集序列化为嵌套序列化程序?

python - 带有类别 slug 的 django 组子类别

django - 如何上传图片文件并显示

PHP MySQL 选择字段并增加值