我最近才开始使用Django REST框架 . 我想创建一个用户 . 之前(没有Django REST框架)我曾经使用以下逻辑创建用户(使用django.contrib.auth.models中的用户模型):
步骤1)创建一个用户注册表单(-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)创建一个View,在提交时处理此表单:
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框架只有在我返回用户对象时才会发挥作用 . 所以假设我想将User作为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”请求 .