我有一个视图,可以通过Pool
模型在Member
模型中使用m2m字段来编辑MemberPoolDates
模型。
pool
模型中的MemberPoolDates
字段必须始终设置为当前Pool
的实例,因此我指定了initial=[{'pool': pool}]
问题在于,当我使用initial=[{'pool': pool}]
时,我无法通过勾选框来删除表单。删除在没有initial=
参数的情况下按预期工作,但在这种情况下需要手动指定MemberPoolDates.pool
,我想避免这种情况。
奇怪的是,如果我使用initial=
,但使用下拉列表将其设置为'----',那么删除就可以了。
如何进行删除工作并使用初始值?
以下是相关代码:
models.py:
class Member(models.Model):
...
name = models.CharField(max_length=10, unique=True)
description = models.CharField(max_length=50, blank=True)
class Pool(models.Model):
...
members = models.ManyToManyField(Member, through='MemberPoolDates')
class MemberPoolDates(models.Model):
member = models.ForeignKey(Member)
pool = models.ForeignKey(Pool)
date = models.DateField(null=True, blank=True)
views.py:
def edit_pool(request, pool_id=None):
pool = Pool.objects.get(id=pool_id)
MemberFormSet = modelformset_factory(MemberPoolDates, form=MemberForm,
can_delete=True)
if request.method == 'POST':
poolform = PoolForm(request.POST, instance=pool)
memberformset = MemberFormSet(request.POST)
if poolform.is_valid():
pool = poolform.save()
if memberformset.is_valid():
memberformset.save()
return redirect('edit_pool', pool_id=pool.id)
else:
poolform = PoolForm(instance=pool)
memberqueryset = MemberPoolDates.objects.filter(pool=pool)
memberformset = MemberFormSet(queryset=memberqueryset,
initial=[{'pool': pool}])
return render(request, 'edit_pool.html', {'poolform': poolform,
'memberformset': memberformset})
[编辑] 似乎django只在formset中的'extra'表单验证时才执行删除,显然它不验证是否提供了初始值?!