2013-03-25 26 views
0

我在這裏失去了我的想法。顯然,我在Django的ModelForms中遇到線程安全問題,我不知道爲什麼。在下面的代碼中,我將_links_to_create設置爲AddTaskForm類的私有成員。我在視圖中實例化form = AddTaskForm(request.POST),但每增加一個調用,_links_to_create列表仍然填充。任何想法的人?Django ModelForm線程安全?

class AddTaskForm(forms.ModelForm): 
    class Meta: 
     model = Task 
     fields = ('text', 'created_by', 'task_list',) 

     widgets = { 
      'created_by' : forms.HiddenInput(), 
      'task_list' : forms.HiddenInput(), 
      'text': forms.Textarea(attrs = { 
       'class': 'autogrow', 
       'placeholder': 'Enter a task...', 
       'maxlength' : 140 
       }), 
     } 

    tags = forms.CharField(required = False, widget = PillAutoCompleteInput(
     format = '{key}:{id}:{value}', 
     attrs = {'placeholder' : 'Add people, lists, dates, etc...'})) 

    _links_to_create = [] 

    def __init__(self, *args, **kwargs): 
     super(AddTaskForm, self).__init__(*args, **kwargs) 

     print self.fields['tags'].widget.source 

     self.fields['text'].label = False 
     self.fields['task_list'].required = False 
     self.fields['tags'].label = False 
     self.fields['tags'].widget.source = reverse('smart-complete') 

     # TODO, form was not resetting. This might be a possible thread safety issue 
     print self._links_to_create 
     #self._links_to_create = [] 


    def clean(self): 

     user = self.cleaned_data['created_by'] 
     items = self.cleaned_data['tags'].split(';') 

     task_lists = None 
     team_members = None 

     for item in items: 
      if not item: continue 

      key, id, value = item.split(':') 

      if key == 'list': 
       if not task_lists: 
        task_lists = TaskList.objects.get_all_lists_for_user(user).values_list('id', flat = True) 

       id = int(id) 
       if id in task_lists: 
        self.cleaned_data['task_list'] = TaskList.objects.get(id = id) 

      elif key == 'user': 
       if not team_members: 
        team_members = user.teams.get_members(implied = True).values_list('id', flat = True) 

       id = int(id) 
       if id in team_members: 
        self._links_to_create.append(id) 

     return self.cleaned_data 


    def save(self, *args, **kwargs): 
     task = super(AddTaskForm, self).save(*args, **kwargs) 

     user = self.cleaned_data['created_by'] 
     if len(self._links_to_create): 
      self._links_to_create = [TaskLink(user_id = id, task = task) for id in self._links_to_create] 
     else: 
      self._links_to_create.append(TaskLink(user = user, task = task)) 

     TaskLink.objects.bulk_create(self._links_to_create) 

回答

2

如果你真的想_links_to_create類的每個實例的私有成員,你需要在__init__方法來創建變量。