Skip to main content
 首页 » 编程设计

python之Django 表单 : ManyToMany inline creation

2025年05月04日35thcjp

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

模型:

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

我正在搜索的行为接近于 django 表单集给出的行为。

事实上,我目前能够在某种程度上使用外键关系并依赖于表单集来做到这一点。使用此技术,django-extra-views和 django-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, ] 

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

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

谢谢!

请您参考如下方法:

为了“即时”创建,我通过 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 将起作用。