代码之家  ›  专栏  ›  技术社区  ›  GrantU

Tastypie如何将模型中的错误正确地反馈给用户?

  •  3
  • GrantU  · 技术社区  · 12 年前

    我正在使用 Tastypie 通过API调用创建用户 (请参阅下面的api.py) 。任何错误都会触发相同的 except IntegrityError 正如你所看到的。我希望我的模型向用户返回正确的错误消息。示例请参阅下面的模型管理器,当电子邮件为空时,错误“必须设置给定的电子邮件”应作为IntegrityError错误返回给用户。

    我该怎么做?

    顶点.py

    class CreateResource(ModelResource):
        """
        API Facet that creates and returns a new user with self.user_email
        as login and self.user_password as password.
        """
        class Meta:
            object_class = CompanyUser
            resource_name = 'accounts/create'
            fields = ['password1', 'password2', 'email', 'company']
            allowed_methods = ['post']
            queryset = CompanyUser.objects.all()
            serializer = urlencodeSerializer()
    
        def obj_create(self, bundle, request=None, **kwargs):
            try:
                CompanyUser.objects.create_user(email=bundle.data['email'],
                                                company=bundle.data['company'],
                                              )
    
            except IntegrityError:
                raise BadRequest('Username already exists')
    

    模型管理器

    class EmailUserManager(BaseUserManager):
    
        def create_user(self, email, password=None, **extra_fields):
            """
            Creates and saves an EmailUser with the given email and password.
            """
            now = timezone.now()
            if not email:
                raise ValueError('The given email must be set')
            email = EmailUserManager.normalize_email(email)
            user = self.model(email=email, is_staff=False, is_active=True,
                              is_superuser=False, last_login=now,
                              date_joined=now, **extra_fields)
    
            user.set_password(password)
            user.save(using=self._db)
            return user
    

    在我看来,我的选择是:

    1) 在api.py中,逐个检查所有参数(这似乎很糟糕,因为我的模型已经这样做了),然后上升一个 IntegrityError 对于每个问题,我都有,即电子邮件空白。

    if bundle.data['email'] = '':
        raise BadRequest('no email') 
    

    2) 以某种方式将错误从管理器返回到api.py文件,并引发动态IntegrityError。

    1 回复  |  直到 12 年前
        1
  •  2
  •   Glyn Jackson    12 年前

    如果您使用TastyPie,则查找 validation 。然后可以使用forms.py方法进行验证。