2014-12-18 2 views
1

제 양식의 fieldorder를 설정하려고합니다. 그러나 여하튼 그것은 알파벳 순서로 머물러 있습니다. 누구든지 몇 가지 제안 사항이 있습니까? 내가 클래스 메타 시도 : 필드 = [ "필드", "필드"]과 초기화에 keyOrder을 추가하는django가 필드 순서를 설정합니다.

형태 : 이것은 내가 과거에했던 몇 가지 코드가

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 

, 당신은 단지 rearrange_field_orderself.original_fieldsoriginal_fields을 변경할 수 있습니다.

+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') 
관련 문제