2014-12-18 37 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')