编辑Mod的Django表单向导

2024-10-01 04:54:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django表单向导,可以很好地为我的一个模型创建内容。我想使用相同的向导来编辑现有内容的数据,但找不到一个很好的例子来说明如何编辑。在

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

在表单.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',
        ]

在视图.py在

^{pr2}$

在网址.py在

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

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

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

最好提供一个代码示例或一个链接。在

谢谢, 皮特


Tags: 代码py模型project编辑表单内容fields
3条回答

我刚得到这个工作,所以将张贴的答案,以防它帮助别人。在

您可以传递要在其中编辑的项的ID网址.py像这样:

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

然后,您可以使用以下代码在

在视图.py公司名称:

^{pr2}$

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

pxg的回答是不够的。正如eminbuíra saral所指出的,它创建了模型的一个新实例,而不是编辑它。而艾敏·布拉萨拉尔的回答,光靠自己是不够的。或者不要重写get_form_initial方法,也不要设置初始值,或者使用此答案中提供的实现。你应该这样组合他们的答案:

在网址.py公司名称:

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

在视图.py公司名称:

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

虽然pxg的get_form_initial版本实际上可以工作(只要您还添加get_form_instance覆盖),但无需查找实例、提取其数据和创建初始值字典。所有这些都是在初始化实例之前由ModelForm自动完成的。只需返回一个空的初始值字典,就可以得到更简单、更高效的代码。在

除了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

相关问题 更多 >