3

グローバルな質問と、シグナルのコンテキストにおける特定の問題に関する質問があります。どのような問題を解決するために、シグナル ディスパッチャが最も便利ですか。

複数のモデルフォームを外部キーで保存する際に問題があります。これは信号で解決できると思いました。しかし、信号の範囲を理解していないため、方法がわかりません。

モデル

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

すべてのフォームは、上記のモデルから継承されたモデルフォームです。最後の 2 つは modelformsets で使用されます。このフォームはすべて、テンプレート内の 1 つの 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 を使用してフィールドEducationFormExperienceForm保存する必要があります。cvCV

この問題を信号で解決できますか?

問題の定式化が難しかったので、不明な点があれば質問を編集します。

4

1 に答える 1

12

シグナルは、特定のアクションが発生した後にコードの一部を起動できるようにする単純なフックです。つまり、「モデルのインスタンス/行Fooが保存されたら、関数を実行しますbaz()」。シグナルには、実際のシグナル(実行されたアクション - 保存/削除など) と受信機能(そのアクションが発生したときに何をするか)の 2 つのコンポーネントがあります。

Django には多くのシグナルが組み込まれています (たとえば、保存操作のまたはに起動されるシグナル、削除操作の後または前に起動されるシグナル) が、独自のシグナルを作成することもできます。Web サイトにサインアップ プロセスがある場合、ユーザーがアカウントを作成したときに発生するシグナルを作成し、そのシグナルをユーザーにメールを送信する関数にリンクできます。

あなたの状況は信号の使用に関連しているとは思いません。後者の 2 つのフォーム (教育と経験) が最初に保存される前のフォーム (CV) に依存する単一のフォーム (3 つの小さなフォームで構成される) を作成したいように思えますか?

この場合の問題は、最初に 1 番目のフォームに記入しないと 2 番目と 3 番目のフォームに記入できないことです (履歴書がまだ存在しないため) 。最初に CV を保存し、次に CV を使用して 2 番目と 3 番目のステップを表示します (この段階で CV は既に保存されています)。

于 2011-11-14T09:49:07.833 に答える