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 атрибуты на конкретной форме.

Это лишь базовая концепция подхода, который я бы использовал.

Вернуться на верх