Я пытаюсь создать новых пользователей (+ их профиль), и это кажется хорошим (ответ 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?
спасибо.
Я не думаю, что вы можете установить пароль таким образом. Вы либо используете 'User.create_user (...)', либо создаете пользователя, а затем вызываете 'user.set_password'. Проверьте [docs] (https://docs.djangoproject.com/en/dev/ref/contrib/auth/) – elssar
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(), вы можете использовать его независимо от модели пользователя. –
@elssar не знаю? :( –