【问题标题】:A correct case to use Django signals使用 Django 信号的正确案例
【发布时间】:2011-11-14 09:33:56
【问题描述】:

我有一个全局问题和一个关于信号上下文中的特定问题的问题。 为了解决什么问题,信号调度程序最有用,有点矫枉过正?

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

型号

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)

在视图中,我需要将EducationFormExperienceFormcv 字段以及当前CV 模型的分配ID 一起保存。

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

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

【问题讨论】:

  • 不要认为你需要信号。看看stackoverflow.com/questions/8107751/…
  • 有一天我会开始写我的博客文章“Django 中你不应该使用的东西:第 2 部分,信号”。 (第 1 部分是模型继承,顺便说一句)。
  • @DanielRoseman 请分享您的专业知识。我有一个以这种方式运行的应用程序没有问题。我怎样才能做得更好?如果这是最佳解决方案,我可以覆盖 save 和 clean 以使用信号!
  • @DanielRoseman Ha,我一直使用信号和模型继承;它们对于可以在站点的许多不同区域发生操作的大规模应用程序是必不可少的。 django-notification (github.com/jtauber/django-notification) 是一个几乎完全基于 Signals 的应用程序示例,我将其添加到我创建的每个项目中。

标签: django django-signals


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-28
    • 2011-04-18
    • 2011-02-07
    • 2016-12-10
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    相关资源
    最近更新 更多