2013-04-14 2 views
0

잠재 고객에 대한 세부 정보 모음이있는 예상치가 있습니다. 이름, 주소 등의 것들. 쉬운 것들. 그런 다음 제품, 노동력 등에 대한 주요 추정치와 연결되는 몇 가지가 있습니다 (inlineformset).기본 폼의 유효성을 검사하지 않을 때 inline_formsets 유효성 검사

  1. 실행 기본 폼 유효성을 검사하는 경우 mainForm.is_valid()
  2. 후 저장합니다

    제가하는 데 문제는 22 내 생각이 나는이 방법으로 검증을 할 것이라고했다 캐치의 비트입니다 그와 '하위'형태로 이동 (inlineformset들)

  3. 실행 my_inlineformset.is_valid()
  4. my_inlineformset의 유효성을 검사하면, 너무 저장 - 그리고 그것은 mainForm의 ID로 mainForm에 '첨부'.

다음은 catch입니다. 기본 폼의 유효성을 검사하지 않으면 저장되지 않습니다. 저장하지 않으면 inlineformset에 '첨부'할 수 없습니다. 따라서 mainForm이 유효하지 않고 오류를 수정하기 위해 양식으로 다시 돌아 왔을 때 inlineformset은 비어있게됩니다. 따라서 사용자가 inlineformset에서 많은 자료를 채우지 만 mainForm을 나사로 고정하면 오류를 수정하기 위해 양식으로 다시 돌아올 때 inlineformset의 모든 데이터가 사라집니다.

먼저이 양식을 inlineformset에 저장하고 기본 양식의 유효성을 검사 한 후에 만 ​​기본 양식에 첨부하여이 문제를 피하려고했습니다. 이 문제는 내가 inlineformset의 무리를 절약 할 수 있다는 것입니다. 견적에 절대 첨부되지 않을 것입니다. 필자는 아무것도 붙어 있지 않은 레코드가 전체적으로 필요 없으며 본질적으로 데이터베이스에 불필요하게 떠 다닐 것입니다.

if main.is_valid(): 
     tmp = main.save(commit=False) 
     if estID != 'new': 
      tmp.routeNum = est.routeNum 
      tmp.estMap = est.estMap 
      tmp.estSketch = est.estSketch 
     if estID == 'new': 
      tmp.proposalID = newEstID('R') 
      tmp.sysType = 'R' 
     if estID == 'new': 
      pform = pFormSet(request.POST, instance=tmp, prefix="product_form") 
      lform = lFormSet(request.POST, instance=tmp, prefix="labour_form") 
      oform = oFormSet(request.POST, instance=tmp, prefix="other_form") 
     else: 
      pform = pFormSet(request.POST, instance=est, prefix="product_form") 
      lform = lFormSet(request.POST, instance=est, prefix="labour_form") 
      oform = oFormSet(request.POST, instance=est, prefix="other_form") 

     if pform.is_valid(): 
      pform.save() 

그래서 당신이 주요 유효성을 검사하지 않는 경우, 다음 내 FormSet의이 (확인을 위해 확인되지 않습니다 것을 알 수 있습니다 다음은 pform 전에 시작이라는 것을 오류가 발생합니다 :

여기 내보기 코드입니다). 그렇지만 주전산기 전에 pform의 유효성을 검사 할 경우 main 자체가 유효성을 검사하지 않으므로 저장하지 않으면 pformmain에 어떻게 첨부합니까?

그렇다면 인라인 formset 데이터를 처리하는 방법과 같은 페이지의 다른 양식이 유효성을 검사하지 않으면 어떻게됩니까?


편집 난 그냥이 페이지를 분할에 대해 궁금하네요

(4 개 형태이있는 - 기본 폼과 3 개 인라인 형태) 4 단계에 있습니다. 사용자는 각 양식을 별도로 작성해야합니다. 그런 식으로 내가 위에서 언급 한 문제에 대해 걱정없이 안전하게 검증 할 수 있습니다. 물론 이것은 사용자가 필요한 것보다 더 많은 작업을 수행하는 것처럼 보입니다.

답변

1

왜 양식 세트를 인스턴스화하기 전에 주 양식의 유효성을 검사하고 저장해야하는지 이해가되지 않습니다. 일반적으로 할 일은 모든 양식을 먼저 인스턴스화 한 다음 아무것도 저장하기 전에 모든 양식의 유효성을 검사하는 것입니다. 그렇게하면 양식이 모두 유효성을 검사 할 경우에만 양식이 저장된다는 것을 보장 할 수 있으며, 어떤 양식이 실패하면 관련 오류가있는 모든 것을 다시 표시 할 수 있습니다.

+0

예, 당신은 그것을 찍었습니다. 어떤 이유로 든 메인 폼을 먼저 저장 한 다음 폼 세트를 확인/저장해야한다는 것을 내 마음 속에 생각했습니다. 방금 언급 한대로했는데 제대로 작동한다고 생각하지 않습니다. 유효성을 검사하지 않는 기본 양식은 하위 양식에 영향을 미치지 않으며 기본 양식 (또는 기본 양식)이 저장되지 않은 경우에도 모든 데이터를 보관합니다. – Garfonzo

0

당신의 접근 방식은 괜찮습니다. 모든 양식을 한 페이지에 표시하고 있지만, 포맷 세트가 필요하지 않을 수도 있습니다. .. 완전히 확신 할 수는 없지만 페이지에있는 각 양식의 인스턴스가 1 개만 필요하면 어쩌면 양식 세트가 필요하지 않을 수도 있습니다.

유효성 검사에 관해서는 3 가지 다른 양식을 처리 한 다음 저장 프로세스에서 모든 저장 관리를 수동으로 수행하고 기본 양식을 저장하기 전에 (커밋 = 거짓) 다중 관계를 지정하십시오. 템플릿에

# views.py ... 

def my_display_forms_view(request): 
    if request.method == 'POST': 
     m = M() 
     a = A() 
     b = B() 

     a_form = AForm(request.POST, instance=a) 
     b_form = BForm(request.POST, instance=b) 
     m_form = MForm(request.POST, instance=m) 

     if a_form.is_valid() and b_form.is_valid() and m_form.is_valid(): 
      a = a_form.save() 
      b = b_form.save() 
      m = m_form.save(commit=False); # don't save it to db still 
      m.a = na 
      m.b = nb 
      m.save() 
      # eventually do some more stuff 
    else: 
     # generate new unbound forms here 
     a_form = AForm() 
     b_form = BForm() 
     m_form = MForm() 
    return render_to_response('template.html', {'m_form': m_form, 'a_form': a_form, 'b_form': b_form}, context_instance=RequestContext(request)) 

그리고 다음을 :

가정 M은 M는, 다음과 같이 그것을 할 수있는 외국 키가있는 관련 모델의 메인 모델 A, B입니다

{% if m_form and a_form and b_form %} 
<form ... > 
<!-- show main form here --> 
<fieldset> 
<!-- here the other forms --> 
</fieldset> 
</form> 
{% endif %} 

그리고 그렇게해야합니다.

+0

사용자가 여러 제품을 추가 할 수 있어야하므로 여러 형식의 제품을 추가 할 수 있으므로 양식 세트가 필요합니다. 그러므로 formsets. 마찬가지로 노동과 "다른"형식에도 마찬가지입니다. – Garfonzo