Поле формы django отображается не по порядку
У меня есть такая форма и модель для группы:
class GroupForm(forms.ModelForm):
class Meta:
model = Group
fields = ('leader', 'description', 'size', 'max_size', 'motto')
widgets = {
'size': forms.CheckboxInput(attrs={'id': 'size'}),
'max_size': forms.TextInput(attrs={'type': 'hidden', 'id': 'maxSize'}),
}
У создателя группы есть возможность отметить "да" для size
и, сделав это, я использовал javascript для изменения типа max_size
на show
.
В моем create_group.html
шаблоне:
<script>
let size = document.getElementById('size')
let maxSize = document.getElementById('maxSize')
let checked = false
size.onclick = () => {
checked = !checked
if (checked === true) {
maxSize.type = 'show'
} else {
maxSize.type = 'hidden'
}
}
</script>
Теперь это работает нормально, единственная проблема в том, что поля отображаются не по порядку.
Когда страница загружается, max_size
становится false
, а его поле не отображается. Что хорошо. Однако, когда пользователь проверяет, что группа имеет размер, и, впоследствии, max_size
имеет отображение show
, поле отображается после поля motto, а не в правильном порядке согласно fields = ('leader', 'description', 'size', 'max_size', 'motto')
.
Кроме того, поле max_size
включено внутрь самого элемента motto
, а не как собственное поле:
по сравнению с другими полями, которые находятся каждый в своем собственном <p></p>
.
Я предполагаю, что {{form.as_p}}
и т.д. сначала отображают все видимые поля, а затем скрытые.
Вы можете явно вывести поля в нужном вам порядке в вашем шаблоне. Вместо жесткого кодирования порядка в шаблоне, возможно следующее (я никогда не пробовал):
FIELD_ORDER = ( ('leader', 'description', 'size', 'max_size', 'motto')
class GroupForm(forms.ModelForm):
class Meta:
model = Group
fields = FIELD_ORDER
Передайте вашему шаблону список полей, явно расположенных в нужном вам порядке:
fields_in_order = [ form[x] for x in FIELD_ORDER ]
В шаблоне
{% for field in fields_in_order %}
{{field}}
{% endfor %}
Или, вы можете сделать так, чтобы скрытие этого поля выполнялось с помощью JS
Если кто-то еще столкнется с этой проблемой, можно также просто использовать js и css. В данный момент я использую javascript, чтобы увидеть, проверен ли size
, и если да, то maxSize.style.display = 'block'
против maxSize.style.display = 'none'
, если size
не проверен.
Затем у меня возникла проблема с тем, что ярлык формы django все еще остается видимым. Чтобы исправить это, я увидел ответ на dev.to, который вы можете посмотреть сами.
Теперь моя проблема в том, что я не знаю, как добавить метку, которая будет видна только тогда, когда поле формы видно.