我正在用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()
这远不是一个优雅的解决方案(首先,它使除了最通用的模板之外的任何东西都成为一个直接的噩梦。有人能想到更简单的方法吗?
答案 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()