要实现Django表单保存m2m附加字段,可以使用自定义的中间模型。下面是一个例子:
首先,创建一个包含附加字段的中间模型:
from django.db import models
class MyIntermediateModel(models.Model):
m2m_field = models.ForeignKey('Model2', on_delete=models.CASCADE)
other_field = models.CharField(max_length=100)
# 添加其他所需的字段
class Meta:
unique_together = ('m2m_field', 'other_field') # 定义唯一约束
def __str__(self):
return self.other_field
接下来,定义包含m2m字段和附加字段的模型:
from django.db import models
class Model1(models.Model):
m2m_field = models.ManyToManyField('Model2', through='MyIntermediateModel')
def __str__(self):
return self.name
class Model2(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
然后,创建一个表单来处理Model1和MyIntermediateModel的数据:
from django import forms
from .models import Model1, MyIntermediateModel
class MyForm(forms.ModelForm):
class Meta:
model = Model1
fields = ('m2m_field', 'other_field') # 添加其他所需字段
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
instance = kwargs.get('instance')
if instance:
self.fields['m2m_field'].initial = instance.m2m_field.all()
self.fields['other_field'].initial = instance.m2m_field.values_list('myintermediatemodel__other_field', flat=True)
def save(self, commit=True):
instance = super().save(commit=commit)
if commit:
instance.m2m_field.clear()
for m2m in self.cleaned_data['m2m_field']:
MyIntermediateModel.objects.create(m2m_field=m2m, other_field=self.cleaned_data['other_field'], model1=instance)
return instance
在视图中,我们可以使用这个表单来处理表单数据:
from django.shortcuts import render
from .forms import MyForm
def my_view(request):
if request.method == 'POST':
form = MyForm(request.POST)
if form.is_valid():
form.save()
# 处理保存成功后的逻辑
else:
form = MyForm()
return render(request, 'my_template.html', {'form': form})
这样,当表单被提交时,m2m_field和other_field的数据会被保存到数据库中,并且会创建对应的中间模型实例。