2013-05-09 1 views
3

동적 formset을 처리 할 때 TOTAL_FORMS가 실제 양식 수보다 큰 경우가 있습니다. 또한이 TOTAL_FORMS 입력은 사용자가 쉽게 수정할 수 있습니다.
그래서 예를 들어, 내 입력은 표시 만이 실제 형태가있다, 그러나TOTAL_FORMS의 실제 숫자가 실제 숫자와 다른 경우 Django formset

<input name='user-TOTAL_FORMS' type='hidden' value='5'/> 

입니다.

이 경우 Django는 formset.forms 변수에 원하지 않는 빈 양식을 생성합니다. 그리고 유효성 검사 오류가 있고 양식이 다시 표시되면 문제가 발생합니다. 페이지에 원하지 않는 양식이 표시됩니다. (이 예에서 실제 양식은 2 개만 표시해야하지만 총 수는 5이므로 사용자가 총 5 개의 양식을 볼 수 있습니다.)

이러한 원치 않는 양식을 제거하고 총 개수를 업데이트하고 양식을 업데이트 된 양식으로 다시 표시하려면 어떻게해야합니까?

편집 : 어려운 부분은 양식을 제거 할 때 색인을 업데이트하는 것입니다. 총 양식 수는 마지막 양식 색인과 일치합니다.

답변

0

이전 질문이었고 장고가 많이 변경된 것인지 확실하지 않습니다. 그러나 내가 그것을 끝내는 방법은 formset 데이터를 업데이트하는 함수를 작성하는 것이 었습니다. 여기에서 핵심은 formset 데이터 (QueryDict)의 복사본을 먼저 만드는 것입니다. 다음은 코드입니다.

def updateFormDataPrefixes(formset): 
    """ 
    Update the data of the formset to fix the indices. This will assign 
    indices to start from 0 to the length. To do this requires copying 
    the existing data and update the keys of the QueryDict. 
    """ 

    # Copy the current data first 
    data = formset.data.copy() 

    i = 0 
    nums = [] 
    for form in formset.forms: 
     num = form.prefix.split('-')[-1] 
     nums.append(num) 
     # Find the keys for this form 
     matched_keys = [key for key in data if key.startswith(form.prefix)] 
     for key in matched_keys: 
      new_key = key.replace(num, '%d'%i) 
      # If same key just move to the next form 
      if new_key == key: 
       break 
      # Update the form key with the proper index 
      data[new_key] = data[key] 
      # Remove data with old key 
      del data[key] 
     # Update form data with the new key for this form 
     form.data = data 
     form.prefix = form.prefix.replace(num, '%d'%i) 
     i += 1 

    total_forms_key = formset.add_prefix(TOTAL_FORM_COUNT) 
    data[total_forms_key] = len(formset.forms) 
    formset.data = data 
관련 문제