2014-03-29 2 views
0

Я пытаюсь создать новых пользователей (+ их профиль), и это кажется хорошим (ответ 201), но пароль пуст в базе данных.В Tastypie, почему пароль не написан в базе данных при создании нового пользователя?

У меня есть следующие модели:

class CliProfile(models.Model): 
    user = models.OneToOneField(User, related_name='cliuser') 
    # other stuff 

и следующие ресурсы:

class CliProfileResource(ModelResource): 

    user = fields.ForeignKey(UserResource, 'user', full=True) 

    class Meta(CommonResourceMeta): 
     queryset = CliProfile.objects.all() 
     resource_name = 'client_infos' 
     fields = ['id'] 
     list_allowed_methods = ['post'] 


    def obj_create(self, bundle, request=None, **kwargs): 
     ''' 
     We only need the email-adress to register a user. 
     ''' 

     ema = bundle.data['user']['email'] 
     usn = ema[:30] # Dirty, will be changed 
     raw_pwd = mkpasswd() # Returns a 8 characters random password 

     try: 
      # Launches model validation 
      User(username=usn, email=ema, password=raw_pwd).full_clean() 
     except ValidationError as e: 
      raise CustomBadRequest(
       code="wrong_user_infos_exception", 
       message="Information is wrong as detailed: {0}". 
        format(e)) 
     else: 
      bundle.data['user']['username'] = usn 
      bundle.data['user']['password'] = make_password(raw_pwd) 
      bundle = super(ClientInfoResource, self).obj_create(bundle, **kwargs) 

     return bundle 

    # The UserResource is not paste here, but it has nothing special (no override) 

полезные данные для запроса POST это как-то просто, как:

data_post = { 
     "user":{ 
      "email": "[email protected]", 
     } 

Другой вопрос. У меня такое чувство, что я делаю что-то неправильно, так как я предполагаю, что создание пользователя должно быть в UserResource, а не в CliProfileResource. Действительно, у меня есть BusinessProfileResource (также связанный с пользователем), и мне придется поместить то же самое создание пользователя в этот ресурс, который НЕ сухой. Есть ли чистый способ разделить: создание пользователя в UserResource и информация об Cliprofile в CliProfileResource?

спасибо.

+0

Я не думаю, что вы можете установить пароль таким образом. Вы либо используете 'User.create_user (...)', либо создаете пользователя, а затем вызываете 'user.set_password'. Проверьте [docs] (https://docs.djangoproject.com/en/dev/ref/contrib/auth/) – elssar

+0

make_password находится в [doc] (https://docs.djangoproject.com/en/1.4 /topics/auth/#django.contrib.auth.hashers.make_password), и блоггер использует его [здесь] (http://psjinx.com/programming/2013/06/07/so-you-want-to-create -Пользователи-используя-djangotastypie /). Сравните с set_password(), вы можете использовать его независимо от модели пользователя. –

+0

@elssar не знаю? :( –

ответ

0

Я нашел причину, из-за поля fields моего UserResource, который не содержит password в разрешенных полях. Когда я добавляю его, он работает.

Тем не менее, поскольку для запросов GET был задан пароль, поэтому я переопределил метод UserResource dehydrate().

Рабочая версия:

class Meta(CommonResourceMeta): 
    queryset = User.objects.all() 
    resource_name = 'users' 
    fields = ['id', 'username', 'email', 'password', 'bizuser'] 
    detail_allowed_methods = ['get'] 

...

def dehydrate(self, bundle): 
    '''Remove pwd from data bundle for obvious security purposes''' 
    try: 
     bundle.data.pop('password') 
    except: 
     pass 
    return bundle 
Смежные вопросы