2016-11-09 3 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 это означает, что ваша форма не подтвердилась. Это целая другая проблема и не связана с вашим поиском –

Смежные вопросы