簡體   English   中英

表單集驗證無法按預期的方式工作

[英]formset validation not working as intended django

我有一個表單集,我想檢查每個表單以確保閱讀對象不大於目標對象。 由於某種原因,我無法使其正常工作,因為如果讀數大於目標值仍會保存,那么我的表格錯誤也不會顯示出來。 我如何檢查每個表格以驗證每個閱讀對象是否少於我的目標對象,將不勝感激。

這是我在views.py中進行的表單集驗證

class BaseInspecitonFormSet(BaseInlineFormSet): 
  def clean(self): 
     if any(self.errors): 
       return 
     reading = [] 
     for form in self.forms: 
       dim_id = 24 #form.cleaned_data['dimension_id'] 
       reading_data = form.cleaned_data['reading'] 

       target = get_dim_target(dim_id) 
       for x_reading in reading: 
         if int(x_reading) > int(target): 
           print True 
           raise forms.ValidationError("Reading larger than target") 
         else: 
           print False 
         reading.append(reading_data) 

這是我的get_dim_target函數

def get_dim_target(dim_id): 
   target = Dimension.objects.values_list('target', flat=True).filter(id=dim_id) 
   return target 

這是我在views.py中的實際表單集

def update_inspection_vals(request, dim_id=None): 
  dims_data = Dimension.objects.filter(id=dim_id) 
  can_delete = False 
  dims = Dimension.objects.get(pk=dim_id) 
  sheet_data = Sheet.objects.get(pk=dims.sheet_id) 
  serial_sample_number = Inspection_vals.objects.filter(dimension_id=24).values_list('serial_number', flat=True)[0] 
  target = Dimension.objects.filter(id=24).values_list('target', flat=True)[0] 
  title_head = 'Inspect-%s' % dims.description 

  if dims.ref_dim_id == 1: 
    inspection_inline_formset = inlineformset_factory(Dimension, Inspection_vals, formset=BaseInspecitonFormSet, can_delete=False, extra=0, fields=('reading',), widgets={ 
      'reading': forms.TextInput(attrs={'cols': 80, 'rows': 20}) 
    }) 
  if request.method == "POST": 
    formset = inspection_inline_formset(request.POST, request.FILES, instance=dims) 

    if formset.is_valid(): 
      print True 
      new_instance = formset.save(commit=False) 
      for n_i in new_instance: 

        n_i.created_at = datetime.datetime.now() 
        n_i.updated_at = datetime.datetime.now() 
        n_i.save() 

    else: 
       print False 
       formset.errors 
       formset.non_form_errors() 

    return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) 


  else: 
    formset = inspection_inline_formset(instance=dims, queryset=Inspection_vals.objects.filter(dimension_id=dim_id).order_by('serial_number')) 

  return render(request, 'app/inspection_vals.html', 
   { 
     'formset': formset, 
     'dim_data': dims_data, 
     'title':title_head, 
     'dim_description': dims.description, 
     'dim_target': dims.target, 
     'work_order': sheet_data.work_order, 
     'customer_name': sheet_data.customer_name, 
     'serial_sample_number': serial_sample_number, 
   }) 

終於這是我的模板

  <h1>Inspeciton Values</h1> 
  <div class="well"> 
    <form method="post"> 
    {% csrf_token %} 
    <table> 
      {{ formset.management_form }} 
      {% for x in formset.forms %} 
        <tr> 
          <td>         
              Sample Number {{ forloop.counter0|add:serial_sample_number }} 
          </td> 
          <td> 
              {{ x }} 
          </td> 
        </tr> 
      {% endfor %} 
    </table> 
    <input type="submit" value="Submit Values" class="btn-primary" /> 
    </form> 
  </div> 
</div> 

我發現,我必須將讀取和目標轉換為整數,然后才能像魅力一樣發揮作用。

class BaseInspecitonFormSet(BaseInlineFormSet): 
  def clean(self): 
     #if any(self.errors): 
      # return 
     reading = [] 

     target = [] 
     for form in self.forms: 
       dim_id = 24 #form.cleaned_data['dimension_id'] 
       reading_data = form.cleaned_data['reading'] 
       target_data = get_dim_target(dim_id) 
       reading.append(reading_data) 
       target.append(target_data) 
       x_t = target[0]       
       for x_r in reading: 
         if int(x_r) > int(x_t[0]): 
             print "Reading larger than target" 
             raise forms.ValidationError("Reading larger than target",code="bad") 
         else: 
             print "Reading is good" 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM