django 表单设置字段顺序

Han*_*ong 3 forms django 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"]
Run Code Online (Sandbox Code Playgroud)

Jac*_* L. 6

在 Django 1.9 中,添加了强制表单字段顺序的新方法:field_order

看一看(链接到 1.9 版):https : //docs.djangoproject.com/en/1.9/ref/forms/api/#django.forms.Form.field_order

(以及开发版本的链接):https : //docs.djangoproject.com/en/dev/ref/forms/api/#django.forms.Form.field_order

在下面找到一个简短的例子(使用 Django 1.9)

模型.py:

from django.db import models

class Project(models.Model):
     end_date = models.DateField(verbose_name='End date',
                                blank=True)

    start_date = models.DateField(verbose_name='Start date',
                                  blank=True)

    title = models.CharField(max_length=255,
                             blank=False,
                             verbose_name='Title')

    def __str__(self):
        return self.title
Run Code Online (Sandbox Code Playgroud)

表格.py

from django.forms import ModelForm, DateTimeField, SelectDateWidget

from XXX.models import Project

class ProjectForm(ModelForm):
    class Meta:
        model = Project
        fields = '__all__'

    start_date = DateTimeField(widget=SelectDateWidget)
    end_date = DateTimeField(widget=SelectDateWidget)

    field_order = ['start_date', 'end_date']
Run Code Online (Sandbox Code Playgroud)

在此示例中,字段将重新排列为:

  1. start_date <== 使用表单类中的列表
  2. end_date <== 使用表单类中的列表
  3. title <== 未在列表中提及,因此使用默认排序


小智 2

这是我过去完成的一些代码,用于重新排列表单中的字段顺序,并且有效;你也许可以将其放入 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
Run Code Online (Sandbox Code Playgroud)

如果您出于某种原因想跟踪原始文件顺序,只需更改original_fieldsself.original_fieldsin rearrange_field_order