2014-12-18 104 views
1

我想设置我的表单的现场订单。但不知何故,它只是按字母顺序排列。任何人都有一些建议?我试过类元:域=“域”,“场”],并在初始化添加keyOrderdjango表单设置现场订单

形式:

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"] 

回答

1

这是一些代码,我在过去所做的那样以已经工作的表格重新排列字段顺序;你可以把它放到一个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_fieldsself.original_fieldsrearrange_field_order

+0

似乎很好地工作。谢谢:)至少我可以循环我的表单,而不是手动设置每个表单域:) –

0

可能会有点偏离主题。使用django crispy formstheir Layout objects可以按照您完全想要的方式帮助完成格式化。其中包括重新排列字段顺序。

样品来说明:

class UpdateUserForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.helper = FormHelper() 
     self.helper.layout = Layout(
      Field('email'), 
      Field('quote'), 
      Field('website', placeholder="http://"), 
      Field('logo', template="user/logoInput.html"), 
      HTML('<label class="control-label">Other settings</label>'), 
      Field('emailVisible'), 
      Field('subscribeToEmails'), 
      Field('mpEmailNotif'), 
      Field('showSmileys'), 
      Field('fullscreen'), 
     ) 

    class Meta: 
     model = ForumUser 
     fields = ('email', 'emailVisible', 'subscribeToEmails', 'mpEmailNotif', 
        'logo', 'quote', 'website', 'showSmileys', 'fullscreen')