【问题标题】:How to save two forms in same template in models如何将两个表单保存在模型中的同一模板中
【发布时间】:2020-05-29 09:11:01
【问题描述】:

这是我的模板。我有 2 个表单,一个用于提交测试,另一个用于子测试。当我尝试提交一个表单时,我得到 not 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

这是我的看法。第二个是我方便的模板上下文处理器

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')}

【问题讨论】:

  • 能否包含错误的堆栈跟踪?
  • @markwalker_ return Database.Cursor.execute(self, query, params) sqlite3.IntegrityError: NOT NULL 约束失败:lab_test.name
  • 请注意,以这种方式接近它会完全跳过 django 的形式。因此,如果您创建自己的标记并像这样处理POST,则不会使用他们提供的所有内置验证和安全性。
  • @markwalker_ 我有 javascript 表单。如果我使用 django 表单,它就会变得一团糟。

标签: python html css django django-templates


【解决方案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')

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

【讨论】:

  • 我应该包含或删除什么.. 我没听懂??你能解释一下你的答案吗
  • 查看不是 cmets 的五行。四个来自您发布的内容。第二个是您需要修复错误的那个,但我不知道您希望新子测试通过其 ForeignKey 引用哪个测试实例。
  • @manish subtest.test = choices 是你出错的地方。保存Subtest时,FK字段需要是相关对象的实例
  • @markwalker_cna 请写下答案。我没有得到你。这会有很大帮助。PS。我得到的错误不是空约束失败
  • ... 但我真的认为你应该学习使用 Django 表单,而不是滚动你自己的 request.POST 处理。如果您想在一个视图中显示两个表单,请使用 prefix
猜你喜欢
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
相关资源
最近更新 更多