栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

动态表格向导

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

动态表格向导

这是我完成处理的方式

首先, urls.py

url(r'^service/create/$','django_th.views.get_form_list', name='create_service'),

然后在 views.py中

我做了:

def get_form_list(request, form_list=None):    if form_list is None:        form_list = [ProviderForm, DummyForm, ConsummerForm, DummyForm,           ServicesDescriptionForm]    return UserServiceWizard.as_view(form_list=form_list)(request)

这允许使用以下命令定义5个步骤:

  • 3点的已知,表格(
    ProviderForm
    ConsummerForm
    ServicesDescriptionForm
  • 2个未知的(
    DummyForm
    实际上是两次),将在下面动态处理

提供以下内容的 forms.py

DummyForm

class DummyForm(forms.Form):    pass

下一步是从ProviderForm中获取数据,从中获取我选择的服务,并加载此所选服务的:

在我的 views.py中

class UserServiceWizard(SessionWizardView):    def __init__(self, **kwargs):        self.form_list = kwargs.pop('form_list')        return super(UserServiceWizard, self).__init__(**kwargs)    def get_form_instance(self, step):        if self.instance is None: self.instance = UserService()        return self.instance    def get_context_data(self, form, **kwargs):        data = self.get_cleaned_data_for_step(self.get_prev_step(        self.steps.current))        if self.steps.current == '1': service_name = str(data['provider']).split('Service')[1] #services are named th_<service> #call of the dedicated <service>ProviderForm form = class_for_name('th_' + service_name.lower() + '.forms',       service_name + 'ProviderForm')       elif self.steps.current == '3': service_name = str(data['consummer']).split('Service')[1] #services are named th_<service> #call of the dedicated <service>ConsummerForm form = class_for_name('th_' + service_name.lower() + '.forms',       service_name + 'ConsummerForm')        context = super(UserServiceWizard, self).get_context_data(form=form, **kwargs)    return context

这里 :

  • __init__
    get_form_list
    我定义的函数中加载数据
    urls.py
  • get_context_data
    我需要改变
    DummyForm
    在从我选择的下拉菜单中的服务步骤1和3
    ProviderForm
    ConsummerForm
    。由于服务名为“ FoobarService”,因此我将“ Service”拆分
    Foobar(Consummer|Provider)Form
    class_for_name()
    以下所示的服务形式调用:

class_for_name

def class_for_name(module_name, class_name):   m = importlib.import_module(module_name)   c = getattr(m, class_name)   return c

最后

有了这些,我可以随时随地动态更改表单,实际上,我决定在步骤1和3中进行更改,但可以在任何步骤中进行调整;)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/661297.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号