我剛剛纔開始使用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還創建用戶比我上面有不同的方式。
我想能夠創建一個新用戶(使用POST)但是當我序列化一個用戶對象時,我只想返回用戶名而不是密碼。 – user2719875
好的,那麼當你想要返回數據時,你現在有什麼工作,但你需要按照其他用戶的答案來解決問題的第一部分。因此,請保留現在的代碼,這很好,只需從這些鏈接中添加新代碼,以便在人們執行POST請求時創建新用戶。 如果您有任何問題/問題留言:) –
問題是,其他用戶的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