3

我有一个全球性问题和一个关于信号上下文中特定问题的问题。为了解决什么问题,signal dispatcher最有用,大材小用?

我有一个用外键保存多个模型的问题。我认为这是一个信号可以解决它。但我不知道怎么做,因为我不了解信号的范围。

模型

class CV(models.Model):
    title = models.CharField(max_length=255)
    # And other fields...

class HigherEducation(models.Model):
    cv = models.ForeignKey(CV, blank=True, null=True)
    institution = models.CharField(max_length=255)
    # And other fields...

class ProfessionalExperience(models.Model):
    cv = models.ForeignKey(CV, blank=True, null=True)
    company_name = models.CharField(max_length=255)
    # And other fields...

所有的形式都是继承自上述模型的模型形式。最后两个用于模型表单集中。所有这些表单都显示在模板中的一个 html 表单中。

形式

class CVForm(forms.ModelForm):
    class Meta:
        # All the stuff

class EducationForm(forms.ModelForm):
    class Meta:
        # All the stuff

class ExperienceForm(forms.ModelForm):
    class Meta:
        # All the stuff

Education = modelformset_factory(HigherEducation, 
                                 form=EducationForm,
                                 max_num=2)
Experience = modelformset_factory(ProfessionalExperience,
                                  form=ExperienceForm,
                                  max_num=1)

在视图中,我需要使用当前模型的分配 ID 保存EducationFormand ExperienceFormwith字段。cvCV

我可以通过信号解决这个问题吗?

很难提出这个问题,所以如果有什么不清楚的地方,我会编辑这个问题。

4

1 回答 1

12

信号只是简单的钩子,允许您在特定操作发生后触发代码片段,即“当Foo保存模型的实例/行时,运行函数baz()”。信号有两个组成部分:实际信号(已执行的操作 - 保存/删除等)和接收功能(发生该操作时要做什么)。

Django 内置了许多信号(例如,在保存操作之后之前触发的信号,在删除操作之后或之前触发的信号),但您也可以创建自己的信号。如果您的网站中有一个注册流程,您可以编写一个在用户创建帐户时触发的信号,然后将该信号链接到向用户发送电子邮件的函数

我认为您的情况与使用信号无关。在我看来,您想创建一个表单(由 3 个较小的表单组成),其中后 2 个表单(教育和经验)依赖于先保存的前一个表单(CV)?

在这种情况下,问题是您必须先填写第一份表格,然后才能填写第二份和第三份表格(因为尚不存在简历),因此要实现这一点,您最好创建一个包含 3 个步骤的表单向导;首先保存 CV,然后使用 CV 显示第 2 步和第 3 步(在此阶段 CV 已经保存)

于 2011-11-14T09:49:07.833 回答