2010-04-06 3 views
0

webapp를 만드는 중입니다.이 webapp에는 양식 마법사가 있어야합니다. 마법사는 3 개의 ModelForms로 구성되며 완벽하게 작동합니다. 하지만 두 번째 양식이 "편집 양식"이어야합니다. 즉, 인스턴스가 전달되는 양식이 필요합니다.Django에서 편집하기위한 Formwizard

양식 마법사로 어떻게 할 수 있습니까? 모델의 인스턴스를 어떻게 전달합니까? FormWizard 클래스에 get_form 메서드가 있지만 편집/데이터 검토를 위해 formwizard를 사용하는 방법이 문서화되어 있지 않습니까?

답변

4

장고 1.4에서는이 같은 작업을 수행 할 수 있습니다

def edit(request): 
    initial = { 
     0: {'subject': 'Hello', 'sender': '[email protected]'}, 
     1: {'message': 'Hi there!'} 
     } 
    wiz = FormWizard([form1,form2,form3],initial_dict = initial) 
    return wiz(request) 
0

당신은보기에 formwizard 클래스를 사용하고,이 같은 초기를 전달할 수 있습니다 초기는 단계와 동일한 키와 값이 딕셔너리해야

def edit(request): 
    initial = {0: {'field1':'value1'}} 
    return FormWizard([form, some_other_form], initial=initial) 

그냥 일반적인 양식 등의 데이터의 dicts됩니다.

+0

확실 하시겠습니까? 나는 이미 그것을 시도하고 그것은 실패합니다. " 'EditingForm'개체를 호출 할 수 없습니다."라는 오류 메시지가 나타납니다. – espenhogbakk

+0

어 나쁜 내 참으로 거기에 인스턴스를 던져 수 없습니다/내 대답을 –

+0

formWizards에는 status_code가 없기 때문에 미들웨어가 "return FormWizard"것을 좋아하지 않는다고 생각하고 어떤 시점에서 status_code에 대한 검사가 있습니다. == 400. 이걸 시도하면 오류가 발생합니다. – hendrixski

0

당신이 통과해야 데이터가 얼마나 복잡 따라 몇 가지 방법이있다 생각합니다. https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/#providing-initial-data-for-the-forms 을하고 당신과 같이 urls.py에서보기에 전달할 초기 사전 생성 :

현재의 지침을 따를 수

>>> initial = { 
...  '0': {'subject': 'Hello', 'sender': '[email protected]'}, 
...  '1': {'message': 'Hi there!'} 
... } 
>>> wiz = ContactWizard.as_view([ContactForm1, ContactForm2], initial_dict=initial) 

귀하의 다른 옵션을,이 더 복잡하지만 것입니다 좀 더 많은 로직을 가질 수있게하려면 get_initkwargs를 오버라이드하고 거기에 로직을 넣어야합니다 (장고 코드 : https://github.com/django/django/blob/master/django/contrib/formtools/wizard/views.py 참조).

마지막으로 get_initkwargs가 클래스 메소드이고 마법사가 시작될 때 초기 사전을 전달해야하므로 이전 양식의 입력을 기반으로 개체를 제공해야하는 경우 매우 복잡해집니다. 그러나, 당신은 무시 get_form_kwargs에 의해 그것을 할 아마 수 있습니다

def get_form_kwargs(self, step=None): 
    kwargs = {} 
    if step != '0': 
     your_field = self.get_cleaned_data_for_step('0')['your_field'] 
     # logic for getting object based on field goes here 
     kwargs.update({'object': object,}) 
    return kwargs 

그런 다음 당신은 당신이 kwargs로 전달 된 개체를 기반으로 초기 값을 설정하는 형태의 초기화 방법을 사용할 수 있습니다. 마지막 코드를 많이 사용하지만 이전 코드는 실제로 사용하지 않았습니다.