Формы Django, наследование и порядок полей формы

Вы также можете использовать свойство box-shadow для имитации подчеркивания.

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

a.underline {
    text-decoration: none;
    box-shadow: inset 0 -4px 0 0 rgba(255, 255, 255, 1), inset 0 -5px 0 0 rgba(255, 0, 0, 1);
}

63
задан hannson 27 May 2009 в 18:39
поделиться

4 ответа

Начиная с Django 1.9+

Django 1.9 добавляет новый атрибут Form , field_order , позволяющий упорядочивать поля независимо от их порядка объявления в классе.

class MyForm(forms.Form):
    summary = forms.CharField()
    description = forms.CharField(widget=forms.TextArea)
    author = forms.CharField()
    notes = form.CharField()

    field_order = ['author', 'summary']

Отсутствует. поля в field_order сохраняют свой порядок в классе и добавляются после полей, указанных в списке. В приведенном выше примере поля будут созданы в следующем порядке: ['автор', 'сводка', 'описание', 'примечания']

См. Документацию: https://docs.djangoproject.com / en / stable / ref / forms / api / # notes-on-field-ordering

До Django 1.6

У меня была та же проблема, и я нашел другой метод переупорядочения полей в Django CookBook :

class EditForm(forms.Form):
    summary = forms.CharField()
    description = forms.CharField(widget=forms.TextArea)


class CreateForm(EditForm):
    name = forms.CharField()

    def __init__(self, *args, **kwargs):
        super(CreateForm, self).__init__(*args, **kwargs)
        self.fields.keyOrder = ['name', 'summary', 'description']
99
ответ дан 24 November 2019 в 16:12
поделиться

См. Примечания в этот вопрос SO о том, как внутренности Django отслеживают порядок полей; ответы включают предложения о том, как «переупорядочить» поля по своему вкусу (в конце концов, все сводится к тому, чтобы возиться с атрибутом .fields ).

3
ответ дан 24 November 2019 в 16:12
поделиться

Альтернативные методы для изменения порядка полей:

Вставить и вставить:

self.fields.insert(0, 'name', self.fields.pop('name'))

Вставить и добавить:

self.fields['summary'] = self.fields.pop('summary')
self.fields['description'] = self.fields.pop('description')

Всплать и добавить все:

for key in ('name', 'summary', 'description'):
    self.fields[key] = self.fields.pop(key)

Заказная копия:

self.fields = SortedDict( [ (key, self.fields[key])
                            for key in ('name', 'summary' ,'description') ] )

Но подход Селены из Django CookBook по-прежнему кажется наиболее ясным.

2
ответ дан 24 November 2019 в 16:12
поделиться

Я использовал решение, опубликованное Selene, но обнаружил, что оно удаляет все поля, которые не были назначены на keyOrder. Форма, которую я создаю, имеет много полей, поэтому это не очень хорошо сработало для меня. Я создал эту функцию для решения проблемы, используя ответ akaihola, но если вы хотите, чтобы она работала как у Selene, все, что вам нужно сделать, это установить throw_away в True.

def order_fields(form, field_list, throw_away=False):
    """
    Accepts a form and a list of dictionary keys which map to the
    form's fields. After running the form's fields list will begin
    with the fields in field_list. If throw_away is set to true only
    the fields in the field_list will remain in the form.

    example use:
    field_list = ['first_name', 'last_name']
    order_fields(self, field_list)
    """
    if throw_away:
        form.fields.keyOrder = field_list
    else:
        for field in field_list[::-1]:
            form.fields.insert(0, field, form.fields.pop(field))

Вот как я использую это в своем собственном коде:

class NestableCommentForm(ExtendedCommentSecurityForm):
    # TODO: Have min and max length be determined through settings.
    comment = forms.CharField(widget=forms.Textarea, max_length=100)
    parent_id = forms.IntegerField(widget=forms.HiddenInput, required=False)

    def __init__(self, *args, **kwargs):
        super(NestableCommentForm, self).__init__(*args, **kwargs)
        order_fields(self, ['comment', 'captcha'])
11
ответ дан 24 November 2019 в 16:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: