3

に接続されたいくつかのモデルがありますGenericForeignKey

Class Main(models.Model)
    filed_1      = models.CharField(max_length=20)
    object_id    = models.PositiveIntegerField()
    content_type = models.ForeignKey(ContentType)
    object       = generic.GenericForeignKey('content_type', 'object_id')

Class Additional_1(models.Model):
    f_1 = models.CharField(max_length=20)
    f_2 = models.CharField(max_length=20)

Class Additional_2(models.Model):
    d_1 = models.CharField(max_length=20)
    d_2 = models.CharField(max_length=20)

そして、このモデルのフォーム:

Class MainForm(forms.ModelForm):
      class Meta:
           model  = Main
           fields = ('filed_1', 'object_id', 'content_type')

           widgets = {
               'object_id': forms.HiddenInput,
               'content_type': forms.HiddenInput
           }

Class Additional_1Form(forms.ModelForm):
    class Meta:
        model  = Additional_1
        fields = ('f1', 'f2')

Class Additional_2Form(forms.ModelForm):
    class Meta:
        model  = Additional_2
        fields = ('d1', 'd2')

1 つの送信ボタン ( +と+ )を持つ 1 つの html フォームにMainForm+のフィールドで構成されるフォームを作成し、正しい作成と編集を提供する方法。インラインフォームセットのような標準のDjangoコンポーネントを使用してそれを行う方法はありますか?Additional_iFormMainFormAdditional_1FormMainAdditional_2FormForeignKey

PS この質問への回答はドキュメントのこのセクションに含まれているはずですが、回答するには情報が少なすぎます。https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#generic-relations-in-forms-and-admin

エディション #1

# This is always false, because of 'object_id' in main_form
if main_form.is_valid() and additional_1_form.is_valid():
    additional = additional_1_form.save()
    main_form.object_id = additional .id # I need something like this to set object_id 
    main_form.save()
4

1 に答える 1

1

1 つのフォーム タグを作成します。

<form action="..." method="POST">
{{ main_form }}    
{{ additional_form_1 }}    
{{ additional_form_2 }}
<input type="submit" value="Submit!">
</form>

ここで{{ mainform }}{{ additional_form_1 }}{{ additional_form_2 }}は、Django が各フォームに対して生成する HTML です。JavaScript を使用して編集フィードバックや追加機能を追加できます (ユーザーが特定のフィールドに特定の値を選択したときに値を入力するなど)。

バックエンドでは、各フォームが有効かどうかを確認できます。

if (main_form.is_valid() and
   additional_form_1.is_valid() and
   additional_form_2.is_valid()):
   pass

そうでない場合は、フォーム ページにエラーを再度表示できます。

于 2012-08-26T13:15:03.630 に答える