Django: несколько форм как сохранить это не скрытым
Я пытаюсь проверить форму на основе поля выбора типа урона. В шаблоне я показываю только одну форму DamageTypeForm (две другие скрываются функцией js .hide()).
Каждая форма DamageTypeForm имеет некоторые поля required=True, поэтому я не могу сохранить выбранную форму таким образом:
def createDamage(request):
damage_specify_form = DamageSpecify(request.POST or None)
damage_type_form1 = DamageTypeForm1(request.POST or None)
damage_type_form2 = DamageTypeForm2(request.POST or None)
damage_type_form3 = DamageTypeForm3(request.POST or None)
if request.method == 'POST':
damage_type = request.POST.get('damage_type ')
if damage_type == 'DamageType1':
if damage_type_form1.is_valid():
damage_type_form1.save()
return reverse('damage:type1')
elif damage_type == 'DamageType2':
if damage_type_form2.is_valid():
damage_type_form2.save()
return reverse('damage:type2')
elif damage_type == 'DamageType3':
if damage_type_form3.is_valid():
damage_type_form3.save()
return reverse('damage:type3')
else:
damage_type_form1 = DamageTypeForm1()
damage_type_form2 = DamageTypeForm2()
damage_type_form3 = DamageTypeForm3()
context = {
'damage_specify_form': damage_specify_form,
'damage_type_form1': damage_type_form1,
'damage_type_form2': damage_type_form2,
'damage_type_form3': damage_type_form3,
}
return render(request, 'create_damage.html', context)
Как я могу получить damage_type в View перед отправкой формы в шаблоне, чтобы сохранить только нужную форму?
Вот два подхода, которые вы могли бы использовать, основываясь на ответе на ваш предыдущий вопрос. Где было предложено, чтобы вы:
<form>
{% csrf_token %}
{{damage_type_form.as_p}}
<div id="type1">
{{damage_form_1.as_p}}
</div>
<div id="type2">
{{damage_form_2.as_p}}
</div>
<div id="type3">
{{damage_form_3.as_p}}
</div>
<input type="submit" ...>
</form>
Я не совсем понимаю, почему вам было предложено именно так. Но проблема, которую вы осветили, заключается в том, что другие формы ( скрытые) действительно имеют required
поля, хотя их соответствующие формы скрыты.
Одним из способов является использование атрибута novalidate
на теге формы:
<form novalidate>
...
</form>
Это novalidate
атрибут уровня формы, используемый для отключения проверки формы, несмотря на атрибуты содержащихся в ней входов (т.е. отменяет входы с атрибутом required
или те, которые иначе не прошли бы проверку).
ПРИМЕЧАНИЕ: Не используйте novalidate
, если вы просто хотите интернационализировать или иным образом изменить содержание стандартных сообщений об ошибках. Это можно сделать с помощью JavaScript
.
Я лично не думаю, что использование атрибута novalidate
является хорошей практикой, хотя он может пригодиться в некоторых сценариях.
С другой стороны, (моя рекомендация), вы можете использовать JavaScript
или Jquery
для установки/снятия атрибута полей required
, если соответствующая форма видима или нет. Например:
# But let's say you do have separate forms...
<form id="form-1">
...
</form>
<form id="form-2" style="display:none">
...
</form>
# javascript
<script type="text/javascript">
# using jquery here...
$(document).ready(function(){
# Checking for a form's visibility
if($("#form-2").css('display') === 'none'){
# form-2: display is none. Therefore set its field attributes required to false
$('#form-2 input[type="text"]').removeAttr('required');
# or
# $('#form-2 #field_id').removeAttr('required');
}
else{
# form-2: display is not none. Therefore set its field attributes required to true
$('#form-2 input[type="text"]').attr('required','true');
# or
# $('#form-2 #field_id').attr('required','true');
}
});
</script>
Обратите внимание, что вышеприведенная JavaScript
может быть немного чище, даже добавив некоторую event listener
, чтобы определить, когда visibility
форма изменилась: установить/удалить required
атрибуты на конкретной форме.
Это лишь базовая концепция подхода, который я бы использовал.