这是我的模板。我有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')}
答案 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从查询集中选择。