2017-04-07 50 views
0

我正在使用django-select2控件獲取更好的ManyToMany控件。該視圖看起來更好,我可以搜索並選擇許多不同的用戶。但是,保存模型時,允許的用戶列表爲空。我試圖直接從視圖和單元測試。我無法理解我做錯了什麼。ManyToMany關係的Select2控件

有什麼想法?

我強烈懷疑存在兩個問題:一個是保存表單創建模型,另一個是我如何設置data字典值。


我的模型:

class ProjectCode(models.Model): 
    allowed_users = models.ManyToManyField(User, blank=True) 

我的表格:

class ProjectCodeForm(forms.ModelForm): 
    class Meta: 
     model = ProjectCode 
     fields = '__all__' 
     widgets = {'allowed_users': Select2MultipleWidget(), } 

筆者認爲:

def create_code(request): 
    context = {} 
    if request.method == 'POST': 
     form = ProjectCodeForm(request.POST) 
     if form.is_valid(): 
      new = form.save(commit=False) 
      new.save() 
    form = ProjectCodeForm() 
    context['form'] = form 
    return render(request, 'order_book/create_code.html', context) 

我的測試:

def test_code_create_post_pass(self): 
    init = len(ProjectCode.objects.all()) 
    data = {'allowed_users': [self.jdoe.pk, ], } 
    response = self.client.post('/order_book/code/create/', data) 
    self.assertEqual(response.status_code, 200) 
    self.assertContains(response, "Create a project code") 
    self.assertEqual(init + 1, len(ProjectCode.objects.all())) 
    self.assertEqual("jdoe", ProjectCode.objects.all()[0].display_allowed_users()) 

此測試失敗,:

====================================================================== 
FAIL: test_code_create_post_pass (order_book.tests.AuthorisedViewTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/path/tests.py", line 385, in test_code_create_post_pass 
    "jdoe", ProjectCode.objects.all()[0].display_allowed_users()) 
AssertionError: u'jdoe' != u'' 
- jdoe 
+ 

回答

0

發帖提問,繼續pdb玩,一個想法彈出...我修改了視圖:

def create_code(request): 
    context = {} 
    if request.method == 'POST': 
     form = ProjectCodeForm(request.POST) 
     if form.is_valid(): 
      new = form.save(commit=False) 
      # I am doing "clever" things with the new object here, 
      # like setting a creator and created date/time… 
      new.save() 
      for usr in form.cleaned_data['allowed_users']: # ← This is NOT correct 
       new.allowed_users.add(usr) # ← Neither is this… 
    form = ProjectCodeForm() 
    context['form'] = form 
    return render(request, 'order_book/create_code.html', context) 

我得到一個錯誤,說allowed_users無法設置爲new還沒有主鍵。這導致我在保存對象後嘗試設置數據。

請注意,測試data是正確的,並且測試現在正常通過。

或者,你可以read the freaking documentation並使用正確的方法save_m2m()

def create_code(request): 
    context = {} 
    if request.method == 'POST': 
     form = ProjectCodeForm(request.POST) 
     if form.is_valid(): 
      new = form.save(commit=False) 
      # I am doing "clever" things with the new object here, 
      # like setting a creator and created date/time… 
      new.save() 
      form.save_m2m() # ← This is CORRECT! 
    form = ProjectCodeForm() 
    context['form'] = form 
    return render(request, 'order_book/create_code.html', context)