18

以下の私のコードはちょっと機能し、Userオブジェクトを作成して保存しますが、パスワードは保存しません。

class CreateUserResource(ModelResource):
    class Meta:
        allowed_methods = ['post']
        object_class = User
        authentication = Authentication()
        authorization = Authorization()
        include_resource_uri = False
        fields = ['username']

    def obj_create(self, bundle, request=None, **kwargs):
        try:
            bundle = super(CreateUserResource, self).obj_create(bundle, request, **kwargs)
        except IntegrityError:
            raise BadRequest('That username already exists')
        return bundle

メタフィールドに「パスワード」を追加すると、生のパスワードは保存されますが、ハッシュは保存されません。私は何が間違っているのですか?


だからこれは私のために働いたものです:

def obj_create(self, bundle, request=None, **kwargs):
    username, password = bundle.data['username'], bundle.data['password']
    try:
        bundle.obj = User.objects.create_user(username, '', password)
    except IntegrityError:
        raise BadRequest('That username already exists')
    return bundle
4

3 に答える 3

21

ユーザーを作成するときは、set_password メソッド user.set_password(bundle.data.get('password'))を使用するか、User オブジェクトの create_user メソッドを使用する必要があります。

user = User.objects.create_user(bundle.data.get('username'), bundle.data.get('email'), bundle.data.get('password'))

したがって、次のようなものがうまくいきます。

def obj_create(self, bundle, request=None, **kwargs):
    try:
        bundle = super(CreateUserResource, self).obj_create(bundle, request, **kwargs)
        bundle.obj.set_password(bundle.data.get('password'))
        bundle.obj.save() 
    except IntegrityError:
        raise BadRequest('That username already exists')
    return bundle
于 2012-01-18T18:40:34.090 に答える
5

私は同じ状況にあり、両方の解決策が役に立ちましたが、完全ではありませんでした。どちらでも、空のユーザー名でユーザーを作成できました。私はそのようなリークを持ちたくなかったので、これが私がしたことです。

まず、検証フォームを作成しました。

from django import forms
from django.forms import ModelForm
from django.contrib.auth.models import User

class UserForm(forms.ModelForm):
def __init__(self, *args, **kwargs): 
    super(UserForm, self).__init__(*args, **kwargs)

    self.fields['username'].error_messages = {'required': "Please enter username"}
    self.fields['username'].max_length = 30
    self.fields['password'].error_messages = {'required': 'Please enter password'}
    self.fields['password'].max_length = 30

    self.fields['email'].required = False

def clean_username(self):
    username = self.cleaned_data['username']
    if len(username) < 4:
        raise forms.ValidationError("Username has to be longer than 4 characters")  
    return username

def clean_password(self):
    password = self.cleaned_data['password']
    if len(password) < 5:
        raise forms.ValidationError("Password has to be longer than 5 characters")
    return password   

class Meta:
    model = User
    fields = ('username', 'email', 'password')

次に、UserResource 内で

validation = FormValidation(form_class=UserForm)

def obj_create(self, bundle, request=None, **kwargs):
    bundle = super(UserResource, self).obj_create(bundle, request, **kwargs)
    bundle.obj.set_password(bundle.data.get('password'))
    bundle.obj.save() 

    return bundle

私のソリューションが仲間の開発者に役立つことを願っています。ハッピーコーディング!

于 2013-01-13T06:58:23.097 に答える