用于编辑模型的Django表单向导

pxg*_*pxg 10 python django

我有一个Django表单向导,可以很好地创建我的一个模型的内容.我想使用相同的向导来编辑现有内容的数据,但无法找到如何执行此操作的良好示例.

这是我的项目代码的简化版本:

forms.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',
        ]
Run Code Online (Sandbox Code Playgroud)

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]]
Run Code Online (Sandbox Code Playgroud)

urls.py

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

urlpatterns = patterns('',
    (r'^projects/add$', ProjectWizard.as_view(FORMS)),
)
Run Code Online (Sandbox Code Playgroud)

我看到有这个函数https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/#django.contrib.formtools.wizard.views.WizardView.get_form_instance用于设置表单实例,但我不确定如何获取模型ID来进行查找以及代码如何工作.

一个代码示例或一个链接将是最受欢迎的.

谢谢,皮特

pxg*_*pxg 11

我刚刚完成了这项工作,所以如果能帮助别人,我会发布答案.

您可以在urls.py中传递您要修改的项目的ID,如下所示:

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

然后,您可以使用以下代码查找该项目

views.py:

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, {})
Run Code Online (Sandbox Code Playgroud)

您需要将模型转换为dict,以便将其设置为初始数据.