【问题标题】:Django form linking 2 models by many to many fieldDjango表单通过多对多字段链接2个模型
【发布时间】:2023-03-22 16:38:01
【问题描述】:

我有两个模型:

 class Actor(models.Model):
     name = models.CharField(max_length=30, unique = True)
     event = models.ManyToManyField(Event, blank=True, null=True)

 class Event(models.Model):
     name = models.CharField(max_length=30, unique = True)
     long_description = models.TextField(blank=True, null=True)

我想创建一个表单,让我在添加新条目时能够识别两个模型之间的链接。这有效:

 class ActorForm(forms.ModelForm):
     class Meta:
           model = Actor

表单包括名称和事件,允许我创建一个新的 Actor 并将其同时链接到现有的事件。

另一方面,

 class EventForm(forms.ModelForm):
     class Meta:
           model = Event

此表单不包含参与者关联。所以我只能创建一个新事件。我不能同时将它链接到现有的 Actor。

我尝试创建一个内联表单集:

 EventFormSet = forms.models.inlineformset_factory(Event,
       Actor,
       can_delete = False,
       extra = 2,
       form = ActorForm)

但我得到一个错误

<'class ctg.dtb.models.Actor'> has no ForeignKey to <'class ctg.dtb.models.Event'>

这并不奇怪。 inlineformset 适用于我拥有的另一组模型,但这是一个不同的示例。我想我完全错了。

总体问题:如何创建允许我创建新事件并将其链接到现有 Actor 的表单?

【问题讨论】:

  • 一个Event 中涉及多少个Actor?根据我的感觉,我首先会创建一个从EventActor 的外键。
  • 我理解你的意思,但我认为多对多是正确的。多个演员可以参加一个活动,一个演员可以参加多个活动。

标签: django forms many-to-many inline


【解决方案1】:

就我个人而言,我会先将 ManyToMany 放在 Event 上,但每个人都有自己的...

至于怎么做,你会想写一个自定义的ModelForm(不是内联的formset),我们称之为EventForm。它将处理您的所有事件字段,并且还具有ModelChoiceFieldModelMultipleChoiceField 以允许选择所涉及的Actor。然后在您看来,您将拆分 Event 字段和 ForeignKey/M2M 字段的处理。

有意义吗? alt text http://sonicloft.net/im/52

【讨论】:

    猜你喜欢
    • 2014-05-25
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    相关资源
    最近更新 更多