使用Django信号的正确案例

时间:2011-11-14 09:33:57

标签: django django-signals

我有一个全球性问题和一个关于信号环境中特定问题的问题。为了解决问题,信号调度员最有用,是否过度?

我遇到了使用外键保存多个模型的问题。我认为这个信号可以解决它。但我无法理解,因为我不了解信号的范围。

模型

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

所有表单都是从上面的模型继承的模型。最后两个用于modelformsets。所有这些表单都以模板中的一个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)

在视图中,我需要使用EducationForm字段保存ExperienceFormcv以及当前CV模型的已分配ID。

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

很难制定问题,所以如果不清楚,我会编辑问题。

1 个答案:

答案 0 :(得分:12)

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

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

我认为您的情况与使用信号无关。听起来我想要创建一个单独的表单(由3个较小的表单组成),后两个表单(Education& Experience)依赖于先前保存的形式(CV)?

在这种情况下,问题是你不能在没有填写第一个表格的情况下填写第二个和第三个表格(因为还没有CV存在)所以为了达到这个目的,你可能最好创建一个{{3有3个步骤;首先保存CV,然后使用CV显示第2步和第3步(在此阶段CV已经保存)