2012-12-11 3 views
7

내 모델 중 하나의 컨텐트를 만들기 위해 장고 폼 마법사가 잘 작동합니다. 기존 컨텐츠의 데이터를 편집 할 때 동일한 마법사를 사용하고 싶지만이를 수행하는 좋은 예는 찾을 수 없습니다.Django 폼 마법사로 모델 편집

내가 볼

FORMS = [ 
    ('project_essentials', ProjectEssentialsForm), 
    ('project_your_info', ProjectYourInfoForm), 
] 

urlpatterns = patterns('', 
    (r'^projects/add$', ProjectWizard.as_view(FORMS)), 
) 

urls.py

class ProjectEssentialsForm(forms.ModelForm): 
    class Meta: 
     model = Project 
     fields = [ 
      'title', 
      'short_description', 
      'who_description', 
      'problem_description', 
      'solution_description' 
     ] 

class ProjectYourInfoForm(forms.ModelForm): 
    class Meta: 
     model = Project 
     fields = [ 
      'gender', 
      'location', 
      'post_code', 
      'sector', 
     ] 

views.py

TEMPLATES = { 
    'project_essentials': 'projects/essentials-form.html', 
    'project_your_info': 'projects/your-info-form.html', 
} 


class ProjectWizard(SessionWizardView): 
    instance = None 

    def get_form_instance(self, step): 
     """ 
     Provides us with an instance of the Project Model to save on completion 
     """ 
     if self.instance is None: 
      self.instance = Project() 
     return self.instance 

    def done(self, form_list, **kwargs): 
     """ 
     Save info to the DB 
     """ 
     project = self.instance 
     project.save() 

    def get_template_names(self): 
     """ 
     Custom templates for the different steps 
     """ 
     return [TEMPLATES[self.steps.current]] 

forms.py : 여기

내 프로젝트 코드의 단순화 된 버전입니다 이 기능이있다 https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/#django.contrib.formtools.wizard.views.WizardView.get_form_instance 양식 인스턴스를 설정하는 방법에 대해 설명합니다. 그러나 여기에서 조회를 수행 할 모델 ID를 얻는 방법과 코드가 어떻게 작동하는지 정확히 알지 못합니다.

코드 예제 또는 하나에 대한 링크를 가장 높이 평가할 수 있습니다.

덕분에, 피트

답변

10

난 그냥이 경우에 대답을 게시 할 예정입니다 때문에 작업이 다른 사람의 도움이있어.

당신은 다음과 같이 urls.py에서 편집하고자하는 항목의 ID를 전달할 수 있습니다

: 그런 다음

views.py에서 다음 코드를 사용하여 항목을 찾아 볼 수

(r'^projects/edit/(?P<project_id>[-\d]+)$', ProjectWizard.as_view(FORMS)), 

:

class ProjectWizard(SessionWizardView): 
    def get_form_initial(self, step): 
     if 'project_id' in self.kwargs and step == 'project_essentials': 
      project_id = self.kwargs['project_id'] 
      project = Project.objects.get(id=project_id) 
      from django.forms.models import model_to_dict 
      project_dict = model_to_dict(project) 
      return project_dict 
     else: 
      return self.initial_dict.get(step, {}) 

모델을 사전 데이터로 변환해야 초기 데이터로 설정할 수 있습니다.

+0

양식 마법사를 구현하려고하는데 문제가 있습니다. 당신은 도와주세요 : 게시물은 다음과 같습니다. http://stackoverflow.com/questions/24173367/form-wizard-initial-data-for-edit-not-loading-properly-in-django –

+0

로드 할 수 있습니다. 첫 번째 양식의 초기 데이터,하지만 첫 번째 양식을 제출 한 후 제출 URL을 만들려면 예 : from/Item/edit/1 to/Item/create –

1

pxg의 대답에 추가는 get_form_instance은 다음과 같이해야한다 그렇지 않으면 당신은 모델을 편집 할 수 없습니다 만의 새 인스턴스를 만들 :

def get_form_instance(self, step): 
    if not self.instance: 
     if 'initial_id' in self.kwargs: 
      initial_id = self.kwargs['initial_id'] 
      self.instance = Project.objects.get(id=initial_id) 
     else: 
      self.instance = Project() 

    return self.instance 
2

pxg의 대답은 부족하다. emin-bu-ra-saral이 지적한 것처럼 모델을 편집하는 대신 모델의 새로운 인스턴스를 만듭니다. 그리고 emin-buğra-saral의 대답 자체로는 충분하지 않습니다. get_form_initial 메소드를 무시하지 말고 initial_dict 값을 설정하거나이 응답에서 제공된 구현을 사용하십시오. 반면 get_form_initial 실제로 일할 수 있겠 의 pxg 버전 (

class ProjectWizard(SessionWizardView): 
    def get_form_initial(self, step): 
     if 'project_id' in self.kwargs: 
      return {} 
     return self.initial_dict.get(step, {}) 

    def get_form_instance(self, step): 
     if not self.instance: 
      if 'project_id' in self.kwargs: 
       project_id = self.kwargs['project_id'] 
       self.instance = Project.objects.get(id=project_id) 
      else: 
       self.instance = Project() 
     return self.instance 

:

urls.py에서

:

(r'^projects/edit/(?P<project_id>[-\d]+)$', ProjectWizard.as_view(FORMS)),

views.py에서 이것은 당신이 그들의 대답을 결합하는 방법입니다 마찬가지로 get_form_instance 재정의를 추가하는 경우) 인스턴스를 검색하여 데이터를 추출하고 초기 값을 만들 필요가 없습니다 전자 사전. 이 모든 것은 ModelForm에 의해 initial_dict에서 인스턴스를 초기화하기 전에 자동으로 수행됩니다.단순히 빈 초기 값 사전을 반환하면 더 간단하고 효율적인 코드를 얻을 수 있습니다.

+0

Django의 어떤 버전을 사용하고 있습니까? 내가 최근 버전에서 변경되었을 수도 있습니다 용의자, 내가 장고 1.4.2이 문제를 때 사용했다. 해답을 시험해보고 나의 답변을 업데이트 해 주시면 기쁩니다. 물론 당신의 솔루션이 작동한다면 내 대답을 업데이트하든 관계없이 1.4.2로 작업하는 당신의 솔루션의 가능성을 배제하지 않을 것입니다. – pxg

+0

장고 1.4.16을 사용하고 있습니다. – nmgeek

0

Django 1.11에서 django-formtools 2.1로 작업하려면이 파일을 약간 편집해야했습니다.

class ProjectWizard(SessionWizardView): 
    def get_form_initial(self, step): 
     if 'project_id' in self.kwargs: 
      return {} 
     return self.initial_dict.get(step, {}) 

    def get_form_instance(self, step): 
     if not self.instance_dict: 
      if 'project_id' in self.kwargs: 
       project_id = self.kwargs['project_id'] 
       return Project.objects.get(id=project_id) 
     return None 

get_form_instance 방법은 지금 either an object or None to be returned을 기대하고있다.