【问题标题】:Django form: ManyToMany inline creationDjango 表单:ManyToMany 内联创建
【发布时间】:2016-12-20 10:47:48
【问题描述】:

我希望能够让用户在创建报告时“即时”创建位置。如果可能,请使用以下模型。

型号:

class Report(models.Model):
    ...
    location = forms.ManyToManyField(Location)

class Location(models.Model):
    name = forms.CharField(max_length=255)
    ...

我正在寻找的行为接近 django 表单集给出的行为。

确实,我目前能够在某种程度上使用外键关系并依赖表单集来做到这一点。使用这种技术django-extra-viewsdjango-dynamic-formset,我什至可以让用户选择他们想要添加的位置。

实际设置的精简版:

型号:

class Report(models.Model):
    ...

class Location(models.Model):
    name = forms.CharField(max_length=255)
    report = forms.ForeignKey('Report')

表格:

class LocationForm(forms.ModelForm):
    class Meta:
        model = Location
        fields = '__all__'

class LocationFormSet(extra_views.InlineFormSet):
    model = TestLocation
    form_class = TestLocationForm

观看次数:

class ReportCreateView(extra_views.CreateWithInlinesView):
    model = Report
    inlines = [LocationFormSet, ]

不幸的是,使用此设置,一个位置不能属于多个报告,这会带来很多重复的位置。这就是为什么我认为多对多关系会更合适。我偶然发现了一些与这个问题相关的答案,这些答案谈到了中间模型,但我无法独自去任何地方让它发挥作用。

他们是否可以调整我的工作设置以使其适用于多对多关系?或者是否存在一种完全不同的方法让用户在报告创建期间“即时”创建位置?

谢谢!

【问题讨论】:

标签: python django django-forms many-to-many formset


【解决方案1】:

为了“即时”创建,我通过 ForeingKey 更改了 ManyToMany。

    class Report(models.Model):
        ...
        location = forms.ManyToManyField(Location)  # REMOVE

    class Location(models.Model):
        report = models.ForeignKey(Report)  # ADD
        name = forms.CharField(max_length=255)
        ...

然后,InlineForms 就可以工作了。

【讨论】:

  • 但是这样做的位置是不可重复使用的,对吧?
猜你喜欢
  • 2012-01-05
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 2013-12-22
  • 2011-07-11
相关资源
最近更新 更多