如何从模型 A 的 CreateView 重定向到模型 B 的另一个 CreateView,同时将关键信息从模型 A 传递到下一个视图?

Posted

技术标签:

【中文标题】如何从模型 A 的 CreateView 重定向到模型 B 的另一个 CreateView,同时将关键信息从模型 A 传递到下一个视图?【英文标题】: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? 【发布时间】: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'

【问题讨论】:

【参考方案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 中执行此操作可能更有效有效。

【讨论】:

以上是关于如何从模型 A 的 CreateView 重定向到模型 B 的另一个 CreateView,同时将关键信息从模型 A 传递到下一个视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在views.py中重定向CreateView的URL

没有可重定向到的 URL。提供一个 url 或在模型上定义一个 get_absolute_url 方法

Django Createview根据外键的id保存表单并重定向到页面

如何通过 django-crispy-forms 中的取消按钮重定向到 url?

使用 Django 更新模型实例

如何在 CreateView 中获取创建的对象