2010-11-27 3 views
7

양식에 동적으로 필드를 추가 할 수있는 클라이언트 측 자바 스크립트를 내 템플리트에 넣습니다. 내 문제는 이러한 필드는 form.cleaned_data에 정리되어 있으므로 그렇게 액세스 할 수 없다는 것입니다.동적으로 추가 된 양식 필드는 form.cleaned_data에서 제거됩니다.

모든 필드는 request.POST에서 액세스 할 수 있으므로이 문제를 해결할 수는 있지만 "올바른 방법"으로 수행하려고합니다. 해결책은 요청을 읽는 대신 장고 양식을 사용하는 것입니다. 직접.

form.clean()을 덮어 쓰려고했지만 데이터가 이미 도착할 때까지 이미 사라진 것처럼 보입니다.

기타 세부 정보 :이 필드의 이름은 fieldname_x이며, x은 숫자입니다. request.POST에서 request.POST['fieldname']은 모든 값의 목록이지만 form.cleaned_data은 각 목록의 마지막 값만 포함합니다.

답변

2

이 필드가 어떤 유형인지 미리 아십니까? 그들은 단순한 텍스트 필드일까요? 나는 이것과 비슷한 것을 해왔다. 역동적 인 형태를 만든다.

# make sure these exist by examining request.POST 
custom_fields = ['fieldname_1', 'fieldname_2'] 

attrs = dict((field, forms.CharField(max_length=100, required=False)) 
      for field in custom_fields) 
DynamicForm = type("DynamicForm", (YourBaseForm,), attrs) 
submitted_form = DynamicForm(request.POST) 

제출 한 양식에는 값과 함께 필요한 모든 입력란이 포함되어야합니다. required = False를 제거 할 수도 있지만 이는 사용자의 책임입니다.

이 작업은 attrs로 전달 된 속성을 클래스 정의에 추가하여 기본 양식의 동적 하위 클래스를 수행합니다. 따라서 게시 된 데이터로 인스턴스를 만들 때 올바르게 매핑되어야합니다.

편집 :

질문을 조금 더 자세히 읽습니다. 당신이하고 싶은 일은 동적 인 입력 요소의 이름이 정확하게 지어 졌는지 확인하고 값이 django에 도달하면 값을 해당 필드 이름에 매핑하는 것입니다. 그렇지 않으면 request.POST가 양식을 올바르게 채울 수 없습니다.

<input type='text' name='fieldname_1' value='value_for_field_1' /> 

0

내가 현재 일하고 있어요 프로젝트에이 일을하고 있습니다. 당신은 포맷 세트를보고 싶어 할 것입니다. 그러나 경고하지 마라, 그것은 귀엽지 않다. 폼 카운트에 저장하는이 어리석은 숨겨진 필드를 수정해야하고, 입력의 이름을 올바르게 바꾸어야합니다. 무의미한 문자열 구문 분석이 많이 필요합니다. 그들이 배열을 사용했다면, PHP와 같은 문제가되지 않을 것입니다,하지만 그들은

편집 오프 블라스 ... 내 인생을 비참하게 만들기에 지옥을 구부리고있어 : http://docs.djangoproject.com/en/dev/topics/forms/formsets/#empty-form가 만드는이 제공 당신의 삶이 5 % 덜 고통 스럽습니다 ... 그냥 찾을 수 있고 접두사 적절한 번호로 바꿀 수 있습니다.하지만 내가 어디에 문제가 빈 양식은 적절한 기본값이 포함되어 있지 않습니다 초기화하면 양식을 게시 데이터와 함께, 그래서 난 그냥 지체가 실제로 빈 empty_form 게시물 데이터없이 2 인스턴스를 만들어야했다.

+0

랄프에, 당신이 그것에 대해 먼 길을 갔어요 제안했다. Python을 활용하고 Django 시스템으로 일을합니다. 필요한 경우 모델과 양식을 동적으로 작성하십시오. 내 대답을 보라. –

+0

"leverage python" "과 Django"는 확률이 높습니다. 당신은 확실히 파이썬의 역 동성을 이용했지만 확실히 장고 방법으로 사용했습니다. 그들은 특별히 empty_form을 JS 스크립트에서 사용할 수 있도록 폼에 form/fields를 추가 할 수 있도록하기 위해 empty_form을 넣었습니다. 추가 필드를 해킹 할 필요가 없습니다. – mpen

+0

빈 폼 설명을 자바 스크립트가 폼에 여분의 필드를 추가하는 것이 아니라 폼에 추가하는 것을 허용하는 것으로 해석합니다. 당신은 당신이 그것을했던 방식이 고통스럽고, 많은 문자열 프로세싱을 포함하고, 평범한 나쁜 것이 었습니다. 내 솔루션은 4 줄의 코드이며 유지 관리가 매우 쉽습니다. –

2

양식 파일에서이 작업을 수행 할 수도 있습니다. 여기 동적 양식에 대한 Jacob Kaplan-Mosse의 훌륭한 데모 : http://jacobian.org/writing/dynamic-form-generation/이이 문제에 매우 잘 적용됩니다.

당신이 볼 수 있도록 추가 동적 필드를 추가 한 다음 클린에서 정보를 얻는 메소드를 클래스에 추가하는 것입니다.그리고

class MyForm(forms.Form): 
    text = forms.CharField(max_length=30) 

    def __init__(self, *args, **kwargs): 
     extra = kwargs.pop('extra') 
     super(MyForm, self).__init__(*args, **kwargs) 

     for i, question in enumerate(extra): 
      self.fields['fieldname_%s' % i] = forms.CharField(label=question) 

    def extra_fields(self): 
     for name, value in self.cleaned_data.items(): 
      if name.startswith('fieldname_'): 
       yield (self.fields[name].label, value) 

뷰에서 호출합니다 :

def doSomething(request, extra_fields): 
    form = MyForm(request.POST or None, extra=extra_fields) 
    if form.is_valid(): 
     for (question, answer) in form.extra_answers(): 
      save_answer(request, question, answer) 
     return redirect("create_user_success") 

return render_to_response("template/form.html", {'form': form}) 

매우 깔끔하고 축하를 야곱 카플란 - 모스

관련 문제