2010-07-19 24 views
2

我寫Django的一種形式。該表格是某個型號的型號表格,Experiment。每個Experiment都有與之相關的幾個TimeSlot機型,具有ForeignKey('Experiment')定義。我想要一個表單,可以通過選中框從EditExperimentForm中刪除一個或多個TimeSlot實例。在Django的複選框刪除項目形成

目前,我定義所有的複選框的模型由初始化功能EditExperimentForm一個循環:

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() 

這遠非一件優雅的解決方案(一兩件事,它使任何東西,但最通用的模板直線上升噩夢的工作。誰能想到一個更簡單的方法來做到這一點?

回答

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() 
+0

這工作得很好,只有一個小的變化:它應該是時隙= forms.ModelMultipleChoiceField如果你想能夠檢查多個。 – stillinbeta 2010-07-21 19:28:53

+0

我改變了它:) – Wolph 2010-07-21 19:35:48