Вы также можете использовать свойство 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);
}
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 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']
См. Примечания в этот вопрос SO о том, как внутренности Django отслеживают порядок полей; ответы включают предложения о том, как «переупорядочить» поля по своему вкусу (в конце концов, все сводится к тому, чтобы возиться с атрибутом .fields
).
Альтернативные методы для изменения порядка полей:
Вставить и вставить:
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 по-прежнему кажется наиболее ясным.
Я использовал решение, опубликованное 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'])