如何在模型的同一模板中保存两个表单

时间:2020-02-13 15:42:02

标签: python html css django django-templates

这是我的模板。我有2种形式,一种用于提交测试,另一种用于子测试。当我尝试提交一种形式时,没有得到null_constraint错误。

         <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>
    </div>
    <div id="menu-test-popup">
         <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="test-select" 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>

这是我的模特。在我的模型中,我有测试和子测试。

  class Test(models.Model):
    name = models.CharField(max_length=100)
    def __str__(self):
        return self.name


class Subtest(models.Model):
    name = models.CharField(max_length=100)
    test = models.ForeignKey(Test,on_delete=models.CASCADE,related_name='subtest',blank=True, null=True)
    unit = models.CharField(max_length=10)
    reference_value = models.IntegerField()
    selected = models.BooleanField(default=False)
    def __str__(self):
        return self.name

这是我的观点。第二个是我方便的template_context_processor

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()
        subtest = Subtest()
        test.name = name
        subtest.test = choices
        subtest.name = subtest
        subtest.unit = unit
        subtest.reference_value = reference
        test.save()
        subtest.save()
        print(name)
        return redirect('home')
    return render(request,'main.html',{})   

def list_subtest(request):
    return {'subtest':Subtest.objects.all(),'test':Test.objects.all().prefetch_related('subtest')}

1 个答案:

答案 0 :(得分:1)

您需要将subtest.test设置为Test实例,可能是您刚刚创建的实例。

    #subtest.test = choices  # can't be right
    # might be OK with chosen = Test.objects.get( whatever = choices)

    test.save()
    subtest.test = test  # NB  ... or chosen if above is what you intended
    subtest.save()
    print(name)
    return redirect('home')

注意:如果您打算为Test选择一个subtest,则Django提供forms.ModelChoiceField从查询集中选择。