Изменение порядка полей формы модели - PullRequest
6 голосов
/ 22 февраля 2011

Мне нужно изменить порядок полей в модельной форме, полученной из другого базового класса.Не могу найти решение для этого.«Адрес» в приведенном ниже фрагменте кода всегда отображается в начале HTML-шаблона.Как я могу переместить его дальше вниз с визуализированным шаблоном?Заранее спасибо.

class Address:
   street= ...
   city= ...

class Customer(Address):
   name = ...
   ...

class CustomerForm(ModelForm):
   def __init__(...)
        super(CustomerForm, self).__init__(*args, **kw)
        self.fields.keyOrder=[
        'name',
        'Address',  #<-- I want "Address" appear after the name in my template
                    #<-- This obviously is not the right code.
   class Meta:
      model = Customer

-P

Ответы [ 5 ]

7 голосов
/ 22 февраля 2011

Повторный заказ довольно утомителен:

# django's SortedDict stores ordering of its fields in this list-type attribute:
keyorder = self.fields.keyOrder

# Remove fields which we want to displace:
keyorder.remove('street')
keyorder.remove('city')

# Get position where we want them to put in:
i = keyorder.index('name') + 1

# Insert items back into the list:
keyorder[i:i] = ['city', 'street']

вероятно, лучше просто снова перечислить все поля в правильном порядке:

class MyForm(ModelForm):
    class Meta:
       model=Customer
       fields=[..., 'name', 'street', 'city', ...]
6 голосов
/ 24 января 2017

В Django 1.9 они добавляют новый аргумент в класс Form Теперь вы можете изменить порядок, определив field_order например, добавив два поля в форму заявки userena:

class SignupFormExtra(SignupForm):
    """
    A form to demonstrate how to add extra fields to the signup form, in this
    case adding the first and last name.
    """
    first_name = forms.CharField(label=_(u'First name'),
                             max_length=30,
                             required=False)

    last_name = forms.CharField(label=_(u'Last name'),
                            max_length=30,
                            required=False)
    field_order=['first_name','last_name']

Вы можете использовать его для любой формы, которая наследует класс Форма .

По умолчанию Form.field_order = None, который сохраняет порядок, в котором вы определяете поля в своем классе формы. Если field_order представляет собой список имен полей, поля упорядочиваются в соответствии с указанным списком, а остальные поля добавляются в соответствии с порядком по умолчанию.

5 голосов
/ 03 августа 2015
from django import forms

class CustomForm(forms.Form):
    ORDER = ('field1', 'field2', 'field3')
    def __init__(self, *args, **kwargs):
        super(CustomForm, self).__init__(*args, **kwargs)
        fields = OrderedDict()
        for key in self.ORDER:
            fields[key] = self.fields.pop(key)
        self.fields = fields
2 голосов
/ 15 января 2015

Когда мы обновились до Django 1.7, использование Skyjur .keyOrder перестало работать (Django теперь использует collections.OrderedDict вместо этого). В результате я должен был найти обходной путь, и вот что, похоже, работает для меня:

from collections import OrderedDict
...
class MyForm(forms
    def __init__(self, *args, **kwargs):
        fields = OrderedDict()
        for key in ("my_preferred_first_field", "my_preferred_second_field"):
            fields[key] = self.fields.pop(key)
        for key, value in self.fields.items():
            fields[key] = value
        self.fields = fields
1 голос
/ 24 июля 2018

В более новом Django атрибут fields является collections.OrderedDict, который, начиная с Python 3.2 , имеет новый метод move_to_end, поэтому вы можете просто:

class CustomForm(forms.Form):

    ...

    # Note the following must contain all the fields in the form in the order
    # you desire.
    CUSTOM_ORDER = ('field1', 'field2', 'field3')

    def __init__(self, *args, **kwargs):
        super(CustomForm, self).__init__(*args, **kwargs)

        # Use custom order for form fields.
        for field_name in CUSTOM_ORDER:
            self.fields.move_to_end(field_name)
...