在Django表单中删除带有复选框的项目

时间:2010-07-19 21:51:01

标签: python django django-forms

我正在用Django写一个表格。表单是特定模型Experiment的模型表单。每个Experiment都有几个TimeSlot个与之关联的模型,用ForeignKey('Experiment')定义。我想要一个表单,其中包含通过复选框从TimeSlot中删除一个或多个EditExperimentForm个实例的选项。

目前,我通过EditExperimentForm中 init 函数中的循环定义模型中的所有复选框:

def __init__(self, *args, **kwargs):
    super(EditExperimentForm,self).__init__(*args,**kwargs)
    experiment = self.instance
    for timeslot in experiment.timeslot_set.all():
        self.fields['timeslot-'+str(timeslot.id)] = BooleanField(label="Remove Timeslot at "+str(timeslot.start),required=False)

然后我在提交时用正则表达式处理它们:

timeslot_re = re.compile(r'^timeslot-([\d]+)$')
            for key in form.data.keys():
            match = timeslot_re.match(key)
            if match:
                timeslot = TimeSlot.objects.get(id=match.expand(r'\1'))
                timeslot.delete()

这远不是一个优雅的解决方案(首先,它使除了最通用的模板之外的任何东西都成为一个直接的噩梦。有人能想到更简单的方法吗?

2 个答案:

答案 0 :(得分:1)

如果您为TimeSlot对象使用了模型formset,那么它可能是一个更干净的解决方案。你看过那个吗?

http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#id1

答案 1 :(得分:1)

此代码未经过测试,但是这样的代码应该这样做:

class MyForm(forms.Form):
    # You can change the queryset in the __init__ method, but this should be a nice basis
    timeslots = forms.ModelMultipleChoiceFieldqueryset=Timeslot.objects.all(), widget=forms.CheckboxSelectMultiple)

    def save(self):
        # make sure you do a form.is_valid() before trying to save()
        for timeslot in self.cleaned_data['timeslots']:
            timeslot.delete()