Как сохранить две формы в одном шаблоне в моделях - PullRequest
0 голосов
/ 13 февраля 2020

Это мой шаблон. У меня есть 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

это мой взгляд. А 2-й для моего удобства * 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 Ответ

1 голос
/ 13 февраля 2020

Вам необходимо установить 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 для выбора из набора запросов.

...