2013-10-18 49 views
3

在TastyPie obj_create在我的表單驗證之前運行,它似乎被跳過,爲什麼?Django obj_create在我的表單驗證之前運行

我的代碼

class AccountCreateResource(ModelResource): 
    class Meta: 
     queryset = CompanyUser.objects.all() 
     resource_name = 'accounts/create' 
     allowed_methods = ['post'] 
     validation = FormValidation(form_class=UserCreationForm) 

    def obj_create(self, bundle, request=None, **kwargs): 

     CompanyUser.objects.create_user(email=bundle.data['email'], 
              company=bundle.data['company'], 
              password=bundle.data['company']) 
+0

請添加代碼,在使用這種形式。 – Nik

回答

5

你正在做obj_create首要錯誤obj_create也應該處理數據驗證。如果您查看源代碼here,您會看到調用self.save(bundle)方法。除此之外,該方法還調用運行驗證程序的is_valid方法。在你的情況下,obj_create方法看起來是這樣的:

def obj_create(self, bundle, **kwargs): 
    bundle.obj = CompanyUser() 
    bundle = self.full_hydrate(bundle) 
    bundle.obj.password = bundle.data['company'] 
    return self.save(bundle) 

注意,因爲你的資源是ModelResourcefull_hydrate將設立在bundle.obj你需要的屬性。重要的是要撥打self.save(bundle)返回它的結果。

如果你真的使用CompanyUser.objects.create_user()試試這個來代替:看

def obj_create(self, bundle, request=None, **kwargs): 
    bundle.obj = CompanyUser.objects.create_user(email=bundle.data['email'], 
               company=bundle.data['company'], 
               password=bundle.data['company']) 
    self.is_valid(bundle) 
    if bundle.errors: 
     raise ImmediateHttpResponse(response=self.error_response(bundle.request, bundle.errors)) 
    return bundle 
+1

感謝@kroolik說得通,但那不會叫我CompanyUser.objects.create_user方法嗎? – GrantU

+2

不,它不會。如果您真的想要使用'CompanyUser.objects.create_user',則將返回的用戶分配給'bundle.obj'屬性並調用'self.is_valid(bundle)'並檢查'bundle.errors'。如果出現任何錯誤,請像[這裏]提出'ImmediateHttpResponse'(https://github.com/toastdriven/django-tastypie/blob/v0.10.0/tastypie/resources.py#L2217)。記得在完成之後返回'bundle'。請注意,驗證_after_對象已保存到數據庫並沒有太多意義。 –