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)
在 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)
在此示例中,字段将重新排列为:
小智 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_fields为self.original_fieldsin rearrange_field_order。
| 归档时间: |
|
| 查看次数: |
4461 次 |
| 最近记录: |