Python 如何从两个模型中更新多对多?

Python 如何从两个模型中更新多对多?,python,django,Python,Django,你好,我正在尝试更新两个模型中的多对多字段。我可以成功地从集群模型更新带有M2M字段的集群模型,但无法从子网模型更新它 我将在子网的模板表单中得到一个集群列表。。。布乌特 分配给子网的群集未显示选中状态 当我选择集群并更新表单时,它不会将子网添加到集群 现在我想我只能从集群端更新m2m关系,我说的对吗 型号.py class Cluster(models.Model): cluster = models.CharField(max_length=130, unique=True)

你好,我正在尝试更新两个模型中的多对多字段。我可以成功地从集群模型更新带有M2M字段的集群模型,但无法从子网模型更新它

我将在子网的模板表单中得到一个集群列表。。。布乌特

  • 分配给子网的群集未显示选中状态
  • 当我选择集群并更新表单时,它不会将子网添加到集群
  • 现在我想我只能从集群端更新m2m关系,我说的对吗

    型号.py

    class Cluster(models.Model):
        cluster = models.CharField(max_length=130, unique=True)
        subnet = models.ManyToManyField('Subnet', null=True, blank=True)
    
    class Subnet(models.Model):
        network_address = models.IPAddressField()
        subnet_prefix = models.ForeignKey('SubnetPrefix')
    
    class SubnetForm(forms.ModelForm):
        cluster = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, required=True, queryset=Cluster.objects.all())
    
    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_tag = True
        self.helper.layout = Layout(
            Div(
                Div(Field('network_address', css_class="input-sm"), css_class="col-lg-4"),
                Div(Field('subnet_prefix', css_class="input-sm"), css_class="col-lg-2"),
                css_class="row"
            ),
            Div(
                Div(Field('cluster', css_class="nav nav-list"), css_class="col-lg-4"),
                css_class="row"
            ),
            Div(
                Div(
                    Submit('submit', 'Submit'),
                ),
                css_class="row",
            ),
        )
        super(SubnetForm, self).__init__(*args, **kwargs)
    
        class Meta:
            model = Subnet
    
    class SubnetUpdateView(UpdateView):
        template_name = 'subnet_update.html'
        model = Subnet
        form_class = SubnetForm
        success_url = '#'
    
        def form_valid(self, form):
            messages.success(self.request, u"Subnet updated successfully.")
            return super(SubnetUpdateView, self).form_valid(form)
    
    forms.py

    class Cluster(models.Model):
        cluster = models.CharField(max_length=130, unique=True)
        subnet = models.ManyToManyField('Subnet', null=True, blank=True)
    
    class Subnet(models.Model):
        network_address = models.IPAddressField()
        subnet_prefix = models.ForeignKey('SubnetPrefix')
    
    class SubnetForm(forms.ModelForm):
        cluster = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, required=True, queryset=Cluster.objects.all())
    
    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_tag = True
        self.helper.layout = Layout(
            Div(
                Div(Field('network_address', css_class="input-sm"), css_class="col-lg-4"),
                Div(Field('subnet_prefix', css_class="input-sm"), css_class="col-lg-2"),
                css_class="row"
            ),
            Div(
                Div(Field('cluster', css_class="nav nav-list"), css_class="col-lg-4"),
                css_class="row"
            ),
            Div(
                Div(
                    Submit('submit', 'Submit'),
                ),
                css_class="row",
            ),
        )
        super(SubnetForm, self).__init__(*args, **kwargs)
    
        class Meta:
            model = Subnet
    
    class SubnetUpdateView(UpdateView):
        template_name = 'subnet_update.html'
        model = Subnet
        form_class = SubnetForm
        success_url = '#'
    
        def form_valid(self, form):
            messages.success(self.request, u"Subnet updated successfully.")
            return super(SubnetUpdateView, self).form_valid(form)
    
    视图.py

    class Cluster(models.Model):
        cluster = models.CharField(max_length=130, unique=True)
        subnet = models.ManyToManyField('Subnet', null=True, blank=True)
    
    class Subnet(models.Model):
        network_address = models.IPAddressField()
        subnet_prefix = models.ForeignKey('SubnetPrefix')
    
    class SubnetForm(forms.ModelForm):
        cluster = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, required=True, queryset=Cluster.objects.all())
    
    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_tag = True
        self.helper.layout = Layout(
            Div(
                Div(Field('network_address', css_class="input-sm"), css_class="col-lg-4"),
                Div(Field('subnet_prefix', css_class="input-sm"), css_class="col-lg-2"),
                css_class="row"
            ),
            Div(
                Div(Field('cluster', css_class="nav nav-list"), css_class="col-lg-4"),
                css_class="row"
            ),
            Div(
                Div(
                    Submit('submit', 'Submit'),
                ),
                css_class="row",
            ),
        )
        super(SubnetForm, self).__init__(*args, **kwargs)
    
        class Meta:
            model = Subnet
    
    class SubnetUpdateView(UpdateView):
        template_name = 'subnet_update.html'
        model = Subnet
        form_class = SubnetForm
        success_url = '#'
    
        def form_valid(self, form):
            messages.success(self.request, u"Subnet updated successfully.")
            return super(SubnetUpdateView, self).form_valid(form)
    
    subnet\u update.html

    {% extends 'base.html' %}
    {% load crispy_forms_tags %}
    
    {% block content %}
        <h1>Update Subnet</h1>
        <br />
            {% crispy form %}
        <br />
    {% endblock %}
    
    {%extends'base.html%}
    {%load crispy_forms_tags%}
    {%block content%}
    更新子网
    
    {%crispy form%}
    {%endblock%}
    群集表单的html输出

    <div class="row" >
    <div class="col-lg-4" >
    <div id="div_id_cluster" class="form-group">
        <label for="id_cluster_0" class="control-label  requiredField">Cluster<span class="asteriskField">*</span></label>
        <div class="controls " class="nav nav-list">
            <label class="checkbox"><input type="checkbox" name="cluster" id="id_cluster_1" value="1"  class="nav nav-list">CLUSTER01</label>
            <label class="checkbox"><input type="checkbox" name="cluster" id="id_cluster_2" value="2" class="nav nav-list">CLUSTER02</label>
            <label class="checkbox"><input type="checkbox" name="cluster" id="id_cluster_3" value="3"  class="nav nav-list">CLUSTER03</label>
        </div>
    </div>
    </div>
    </div>
    
    
    簇*
    集群01
    集群02
    集群03
    
    这似乎是以下内容的副本:

    第一个答案不会改变模型,并向您展示了如何使init和save方法复杂化以使您的modelforms工作


    第二个答案是通过模型明确定义自己的m2m,从而使表单保持简单。

    这里没有真正重要的代码。用于更新模型的代码在哪里?它在我的视图SubnetUpdateView中,在调用form_valid方法后,它会自动保存。通过def form_valid(self,form)查看ModelFormMixin:at。