0

我剛剛纔開始使用Django REST框架。我想創建一個用戶。之前(沒有Django REST框架)我用以下邏輯創建用戶(使用django.contrib.auth.models中的用戶模型):Django REST框架 - 註冊/驗證新用戶的正確方法是什麼?

步驟1)創建一個用戶註冊表單當用戶在註冊時最初鍵入他的密碼時,password1和'confirm password'/ password2匹配並且-2-確認用戶名只包含字母,數字下劃線和-3-驗證用戶名未被註冊/採用) :

class RegistrationForm(forms.Form): 

    username = forms.CharField(label='Username', max_length=30) 
    email = forms.EmailField(label='Email') 
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput()) 
    password2 = forms.CharField(label='Confirm Password', widget=forms.PasswordInput()) 

    def clean_password2(self): 
    if 'password1' in self.cleaned_data: 
     password1 = self.cleaned_data['password1'] 
     password2 = self.cleaned_data['password2'] 
     if password1 == password2: 
     return password2 
    raise forms.ValidationError('Passwords do not match.') 

    def clean_username(self): 
    username = self.cleaned_data['username'] 
    if not re.search(r'^\w+$', username): #checks if all the characters in username are in the regex. If they aren't, it returns None 
     raise forms.ValidationError('Username can only contain alphanumeric characters and the underscore.') 
    try: 
     User.objects.get(username=username) #this raises an ObjectDoesNotExist exception if it doesn't find a user with that username 
    except ObjectDoesNotExist: 
     return username #if username doesn't exist, this is good. We can create the username 
    raise forms.ValidationError('Username is already taken.') 

步驟2)創建一個查看它處理這種形式,當它被提交:

if request.method == 'POST': 
    form = RegistrationForm(request.POST) 

    if form.is_valid(): 
     user = User.objects.create_user(
     username=form.cleaned_data['username'], 
     password=form.cleaned_data['password1'], 
     email=form.cleaned_data['email'] 
    ) 

從我的理解,只有當我返回一個用戶對象時,Django REST框架纔會發揮作用。因此,假設我要回用戶作爲JSON對象,我會使用Django的REST框架,像這樣:我serializers.py文件:

class UserSerializer(serializers.ModelSerializer): 

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

和我的觀點與迴歸用戶對象涉及:

if request.method == 'GET': 
    users = User.objects.all() 
    serializer = UserSerializer(users, many=True) 
    return Response(serializer.data) 

這是做這件事的正確方法嗎?由於這種SO後:Django Rest Framework User Registrations with extra fields似乎是創建用戶以不同的方式:

serialized = UserSerializer(data=request.DATA) 
    if serialized.is_valid(): 
     user = User.objects.create_user(
      email = serialized.init_data['email'], 

和這個職位:django rest framework user registration還創建用戶比我上面有不同的方式。

回答

1

所以你已經建立和你有什麼聯繫似乎是解決不同的問題。你在做的是序列化API的用戶數據。所以我可以看到用戶名,如果我使用你的API。但是你的鏈接是允許人們用他們的API創建新用戶。那麼你想要做什麼?

把它放在最好的方法是你做一個「GET」請求,他們正在使用「POST」請求。

+0

我想能夠創建一個新用戶(使用POST)但是當我序列化一個用戶對象時,我只想返回用戶名而不是密碼。 – user2719875

+1

好的,那麼當你想要返回數據時,你現在有什麼工作,但你需要按照其他用戶的答案來解決問題的第一部分。因此,請保留現在的代碼,這很好,只需從這些鏈接中添加新代碼,以便在人們執行POST請求時創建新用戶。 如果您有任何問題/問題留言:) –

+0

問題是,其他用戶的UserSerialzer(http://stackoverflow.com/questions/27078272/django-rest-framework-user-registrations-with-extra-字段)具有「fields =('password','username','first_name','last_name','email','token','phone_number')」。因此,當創建一個新用戶時,他可以執行「serialized = UserSerializer(data = request.DATA)」,因爲內部數據是用戶名,密碼等,他的UserSerializer具有這些字段。我的UserSerializer只有「用戶名」字段,因爲我不想在序列化時返回密碼(或除用戶名以外的其他任何內容)。 – user2719875

相關問題