如果指定了初始值,带有can_delete = True的Modelformset不会删除表单

时间:2012-09-05 04:27:27

标签: django

我有一个视图,可以通过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'表单验证时才执行删除,显然它不验证是否提供了初始值?!

0 个答案:

没有答案