使用Django信号的正确案例

I15*_*159 3 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...
Run Code Online (Sandbox Code Playgroud)

所有表单都是从上面的模型继承的模型.最后两个用于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)
Run Code Online (Sandbox Code Playgroud)

在视图中,我需要使用当前模型的指定ID 保存EducationFormExperienceForm使用cv字段CV.

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

很难制定问题,所以如果有什么不清楚,我会编辑问题.

Tim*_*ony 12

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

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

我不认为你的情况与使用信号有关.听起来我想要创建一个单独的表单(由3个较小的表单组成),后两个表单(教育和体验)依赖于先前保存的形式(CV)?

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