Django obj_create在我的表单验证之前运行

Gra*_*ntU 3 python django tastypie

在TastyPie中,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'])
Run Code Online (Sandbox Code Playgroud)

Mac*_*Gol 5

你正在做最obj_create重要的错误.obj_create还应该处理数据验证.如果你在这里查看源代码,你会看到一个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)
Run Code Online (Sandbox Code Playgroud)

请注意,由于您的资源是ModelResource,full_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
Run Code Online (Sandbox Code Playgroud)

  • 不,它不会.如果你_really_想要使用`CompanyUser.objects.create_user`将返回的用户分配给`bundle.obj`属性并调用`self.is_valid(bundle)`并检查`bundle.errors`.如果出现任何错误,请将[ImmediateHttpResponse]提升为[here](https://github.com/toastdriven/django-tastypie/blob/v0.10.0/tastypie/resources.py#L2217).记得在完成后返回`bundle`.请注意,验证_after_对象已保存到数据库中没有多大意义. (2认同)