Django表单向导来编辑模型 [英] Django Form Wizard to Edit Model

查看:215
本文介绍了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',
]

views.py

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


class ProjectWizard(SessionWizardView):
instance =

def get_form_instance(self,step):

为我们提供项目模型的实例以保存完成

如果self.instance是None:
self.instance = Project()
return self.instance

def done(self,form_list,** kwargs):

将信息保存到DB

project = self.instance
project.save()

def get_template_names自我):

不同步骤的自定义模板

返回[TEMPLATES [self.steps.current]]

urls.py

  FORMS = [
('project_essentials',ProjectEssentialsForm),
('project_your_info',ProjectYou rInfoForm),
]

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

我看到有这个功能https://docs.djangoproject.com/en/dev/ref/contrib/formtools /form-wizard/#django.contrib.formtools.wizard.view/WizardView.get_form_instance 用于设置表单实例,但我不知道如何获取模型ID进行查找这里和确切的代码如何工作。



一个代码示例或链接到一个将是非常感谢。



谢谢,
Pete

解决方案

我刚刚得到这个工作,所以会发布答案,以防万一有帮助其他人。



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

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

然后,您可以在


$ b $中查找以下代码的项目b

views.py:

 类ProjectWizard(SessionWizardView):
def get_form_initial(self,step)
如果self.kwargs中的'project_id'和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,{})

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

I have a Django form wizard working nicely for creating content of one of my models. I want to use the same Wizard for editing data of existing content but can't find a good example of how to do this.

Here is a simplified version of my project code:

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',
        ]

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]]

urls.py

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

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

I see that there is this function https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/#django.contrib.formtools.wizard.views.WizardView.get_form_instance for setting the form instance, but I'm not sure how you would go about getting the models ID to do the look-up here and exactly how the code would work.

A code example or a link to one would be most appreciated.

Thanks, Pete

解决方案

I've just got this working so will post the answer in case it helps someone else.

You can pass the ID of the item you'd like to edit in urls.py like this:

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

You can then look up the item with following code in

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, {})

You need to convert the model to a dict so you can set it as the initial data.

这篇关于Django表单向导来编辑模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆