2016-11-09 61 views
0

我已经尝试过使用的ModelForm保存外键保存外键,但我得到这个错误:正确的方式使用的ModelForm

The LabRequestForm could not be created because the data didn't validate. 

这里是我的代码:

model.py

class LabRequestForm(models.Model): 
    # lab request form 
    product_name = models.ForeignKey(ProductName, on_delete=models.CASCADE) 
    ref_no = models.CharField(max_length=200, unique=True) 
    date = models.DateTimeField() 
    batch_number = models.CharField(max_length=200, unique=True) 
    sampling_time = models.DateTimeField() 
    lab_test_number = models.CharField(null=True, max_length=200) 

forms.py

class LabRequestModelForm(ModelForm): 
    class Meta: 
     model = LabRequestForm 
     fields = '__all__' 

views.py

@login_required 
def sampler(request): 
    detect_user = Account.objects.get(id=request.user.id) 
    if detect_user.is_sampler: 
     if request.method == "POST": 
      prod_name = ProductName.objects.get(product_name=request.POST.get('product_name')) 
      lab_req_form = LabRequestModelForm(request.POST) 
      lab_req_form_obj = lab_req_form.save(commit=False) 
      lab_req_form_obj.product_name = prod_name 
      if lab_req_form_obj.is_valid(): 
       lab_req_form_obj.save() 
       messages.info(request, 'Form Saved') 
      else: 
       print('not valid') 
       messages.error(request, "Form is not valid") 
      return HttpResponseRedirect(request.META.get('HTTP_REFERER')) 

手动我检查每个POST数据,他们是正确的。所以我怀疑lab_req_form.save(commit=False)是主要的罪魁祸首。

回答

0

在验证发生之前,您正在调用保存。您的save(commit=False)应该在if lab_req_form.is_valid()之下。你也打电话is_valid对象,而不是形式。这应该工作

@login_required 
def sampler(request): 
    detect_user = Account.objects.get(id=request.user.id) 
    if detect_user.is_sampler: 
     if request.method == "POST": 
      prod_name = ProductName.objects.get(product_name=request.POST.get('product_name')) 
      lab_req_form = LabRequestModelForm(request.POST) 
      # should validate lab_req_form not lab_req_form_obj 
      if lab_req_form.is_valid(): 
       # moved here 
       lab_req_form_obj = lab_req_form.save(commit=False) 
       lab_req_form_obj.product_name = prod_name 
       lab_req_form_obj.save() 
       messages.info(request, 'Form Saved') 
      else: 
       print('not valid') 
       messages.error(request, "Form is not valid") 
      return HttpResponseRedirect(request.META.get('HTTP_REFERER')) 
+0

应用您的建议,我得到一个无效的表单。它表示我的表单无效 – pyprism

+0

@pyprism这意味着您的表单未验证。这是另一个问题,与您的questino无关 –