2013-12-15 6 views
-1

пытается изменить порядок полей в admin ModelForm. Bellow - моя попытка, однако порядок не изменился. Добавленные поля oi_number и vat_number показаны в конце, кроме того, что они не в конце в self.fields SortedDict dictionary.Неверный порядок полей ModelForm?

class ContactAdminForm(forms.ModelForm): 
    oi_number = fields_for_model(OrganizationExtra)['oi_number'] 
    vat_number = fields_for_model(OrganizationExtra)['vat_number'] 
  # fields = ('organization', 'oi_number', 'vat_number') 
    # ^^^ this won't affect fields order either 

    class Meta: 
     model = Organization 

    def __init__(self, *args, **kwargs): 
     super(ContactAdminForm, self).__init__(*args, **kwargs) 
     try: 
      org_ix = self.fields.keyOrder.index('organization') 
      self.fields.keyOrder.insert(org_ix+1, self.fields.keyOrder[-2]) 
      self.fields.keyOrder.insert(org_ix+2, self.fields.keyOrder[-1]) 
      del self.fields.keyOrder[-2:] 
     except ValueError: 
      pass 

ли получить порядок полей решен до __init__ методы называется? Как я могу изменить свой порядок?

Update: выше ModelForm используется как форма в админ модели, которая определяет свои собственные поля, так что если я ставлю все определение полей в форме выше, я буду получать FieldError исключение о неизвестном имя поля:

class ContactAdminForm(forms.ModelForm): 
    ... 
    class Meta: 
     model = Organization 
     fields = ('organization', 'oi_number', 'vat_number') 

class ContactOptionsEx(ContactOptions): 
    form = ContactAdminForm 

admin.site.register(Contact, ContactOptionsEx) 

# at attempt to render the form: 
# FieldError at /admin/contact/contact/3/ 
# Unknown field(s) (organization) specified for Organization 

Однако поле имени organizationделает существует и доступен в ContactAdminForm.__init__ методом.

+0

ли вы положили 'поля = ... 'под' Мета '? Это должно сработать ... – sk1p

+0

@ sk1p, если я поместил поля в класс 'Meta', тогда я получаю исключение FieldError. Подробнее см. В обновлении вопроса. –

+0

@yuvi Я считаю, что связанный возможный дубликат не полностью отвечает на вопрос. –

ответ

2

Ошибка

Неизвестного поле (s) (организация), определенный для организации

не относится к полю на форме, а поле на модели (Organization).

Я думаю, что проблема заключается в том, что вы пытаетесь добавить поля из другой модели (OrganizationExtra) в ModelForm для Organization. Всегда существует взаимно однозначное соотношение между ModelForm и Model. Если вы хотите редактировать связанный экземпляр в администратора, вы можете использовать Внутристрочные:

class OrganizationExtraInline(admin.StackedInline): 
    model = OrganizationExtra 

class ContactOptionsEx(ContactOptions): 
    inlines = ContactOptions.inlines + [OrganizationExtraInline] 
    # ... 

Если вы хотите ограничить встроенный в одном случае, используйте OneToOneField или max_num = 1

+0

Вы правы, я пытаюсь добавить поля из другой модели. Я знаю, что я могу использовать классы 'StackedInline' или' TabularInline' для отображения полей связанных моделей, однако я бы хотел вставить эти дополнительные поля непосредственно в поле 'organization', т. Е. между полями модели по умолчанию. –

+0

Я предполагаю, что вариант должен был бы использовать встроенную строку на стороне python, но переопределить шаблон изменения, чтобы изменить порядок полей ... теперь не могу придумать ничего другого. – sk1p

+0

@DavidUnric, поэтому, если он настроен таким образом, вы можете отказаться от django.forms и самостоятельно его выполнить. Я лично считаю, что django.forms является самой слабой частью структуры django и имеет много недостатков. Я обнаружил, что сам создавал свои собственные (или использовал альтернативы) не раз, даже когда настройка казалась простой с первого взгляда – yuvi

Смежные вопросы