manish
manish

Reputation: 312

How to have single view for multiple HTML forms - Django

This is my view.So I want to keep 2 different HTML forms in same view ,But I am unable to do so beacuse whenever I add 1 form , I get the error of other on being none.

def home(request):
    name = None
    if request.method == 'POST':
        name = request.POST.get('name')
        choices = request.POST.get('choices')
        subtest = request.POST.get('subtest')
        reference = request.POST.get('reference')
        unit = request.POST.get('unit')
        test = Test()
        test.name = name
        test.save()
        subtest = Subtest()
        subtest.test = Test.objects.get(name=choices)
        subtest.name = subtest
        subtest.unit = unit
        subtest.reference_value = reference
        subtest.save()
        # print(name)
        return redirect('home')
    return render(request,'main.html',{}) 

I have got 2 different forms . I didn't use django forms because I wanted to try something new.

MY FIRST FORM

<form method="POST">
        {% csrf_token %}
        <div class="icon-holder">
          <i data-modal-target="test-popup" class="icon-cross"></i>
        </div>
        <div class="input-group">
          <input type="text" name="name" placeholder="Test name" />
        </div>
        <div class="button-group">
          <button type="submit">Submit</button>
        </div>
      </form>

MY SECOND FORM

<form method="POST">
        {% csrf_token %}
        <div class="icon-holder">
          <i data-modal-target="menu-test-popup" class="icon-cross"></i>
        </div>
        <div class="input-group">
          <label for="test-select">Test Name:</label>
          <select name="choices" id="test-select">
            {% for test in test %}
            <option value="{{test.name}}" name='choices'>{{test.name|title}}</option>
            {% endfor %}
          </select>
        </div>
        <div class="input-group">
          <input type="text" name="subtest" placeholder="SubTest name" />
        </div>
        <div class="input-group">
          <input type="text" name="reference" placeholder="Reference rate" />
        </div>
        <div class="input-group">
          <input type="text" name="unit" placeholder="Unit" />
        </div>
        <div class="button-group">
          <button type="submit">Submit</button>
        </div>
      </form>

Upvotes: 2

Views: 198

Answers (2)

ishak O.
ishak O.

Reputation: 191

first form

<form method="POST">
...
<input name="form_type" value="first-form" type="hidden">
</form>

second form

<form method="POST">
...
<input name="form_type" value="second-form" type="hidden">
</form>

view function

def view(request):
  if method == "POST":

    form_type = request.POST.get('form_type')

    if form_type == "first-form":
      # first form's process
    elif form_type == "second-form":  
      #second form's process

Upvotes: 2

Lag11
Lag11

Reputation: 542

You have two forms here, when you submit the second form, only the fields from the second form gets submitted.

so from this line

name = request.POST.get('name')

name will become None. But I believe your Test model does not take any None value for name field( the reason for you " IntegrityError at / NOT NULL constraint failed: lab_test.name ").

To overcome this, first check if there is any value for 'name' then proceed with creating the test instance

if name:
    test = Test()
    test.name = name
    test.save()

Similarly check if the other fields are present for the second form before creating and saving the instance.

Upvotes: 0

Related Questions