【问题标题】:How to redirect from a CreateView of model A to another CreateView of a model B while passing key information from model A to the next view?如何从模型 A 的 CreateView 重定向到模型 B 的另一个 CreateView,同时将关键信息从模型 A 传递到下一个视图?
【发布时间】:2019-12-02 19:30:48
【问题描述】:

我是 Django 新手,不知道我需要知道什么才能完成这项任务。我的任务是创建一个具有两个模型的 Web 应用程序。模型 A 是员工,模型 B 是包含许多员工的公司。在注册期间,我有一个模型 A 的表格。一旦模型 A 表格填写完毕,我需要将员工的 id 传递给公司注册 url,这样当我将公司模型保存到表中时,我可以确保存储了员工 ID,因此这两个表是相关的。如何将employee_id 发送到公司表单页面?我需要使用某种重定向吗?

流程:dashboard/employee_signup ->dashboard/company_signup -> completed_signup

我浏览了多个关于 Django 的教程,大多数教程似乎都太简单了,无法解决我需要做的事情。

这是我的 EmployeeSignUpView。现在它重定向到“登录”页面。我需要在传递employee_id 时重定向到CompanySignUpView。公司不能有零员工,所以第一个注册公司的人需要存储在公司模型中。 company 表包含一个存储该公司员工列表的列。所以是一对多的关系。

class EmployeeSignUpView(CreateView):
    form_class = FSPEmployeeCreationForm
    success_url = reverse_lazy('login')
    template_name = 'employee_signup.html'

【问题讨论】:

    标签: python django redirect view model


    【解决方案1】:

    您可以定义get_success_url 来返回一个依赖于所创建对象的URL,而不是提供一个静态的success_url。

    假设您的 CompanySignUpView 的 URL 如下:

    path('company_sign_up/<int:employee_id>/', views.CompanySignUpView.as_view(), name='company_sign_up')
    

    那么你会这样做:

    class EmployeeSignUpView(CreateView):
        form_class = FSPEmployeeCreationForm
        template_name = 'employee_signup.html'
    
        def get_success_url(self):
            return reverse('company_sign_up', kwargs={'employee_id': self.object.id})
    

    编辑

    在您的 CompanySignUpView 中,您可以通过 form_valid 方法获取员工 ID:

    class CompanySignUpView(CreateView):
        ...
        def form_valid(self, form):
            form.instance.initial_employee_id = self.kwargs['employee_id'] # or whatever the field name is
            return super().form_valid(form)
    

    【讨论】:

    • 感谢您的回复。我成功地实现了这一点,但是,当提交公司表单时,我该如何提交这个employee_id。我需要以某种方式访问​​即将创建的公司并将employee_id 添加到公司的employee_list 列中。
    【解决方案2】:

    你重定向到类似的东西

    reverse('b:create_b', kwargs={"pk":a.pk}
    

    URL(在应用程序“b”中)类似于

    url(r'create/(?P<pk>\d+)/$', b_create.as_view(), name='create_b'),
    

    您可以通过在b_create 中继承dispatch 方法来获取这个解析的pk 并将其转换为一个完整的对象:

    def dispatch( self, request, *a, **kw):
        # resolve kwarg to self.a_object
        self.a_object = get_object_or_404( A_model, pk = self.kwargs.get('pk','?') )
        return super().dispatch( request, *a, **kw)
    

    尽早执行此操作意味着您的其余视图代码可以在任何地方引用self.a_object。如果不需要(比如说)为表单的初始get 生成默认值,或者直到所有posted 数据都不需要,则仅在postform_valid 中执行此操作可能更有效有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-18
      • 2014-04-03
      • 2021-12-13
      • 2013-03-02
      • 2021-02-20
      相关资源
      最近更新 更多