Django 如何在POST中返回DRF表单数据
因此,我有一个基于类的view views/users.py,其中POST应该将表单中的数据发送到序列化程序以进行验证,如果可以,则创建用户并返回数据,但由于某种原因,它返回404错误请求 以下是观点:Django 如何在POST中返回DRF表单数据,django,forms,django-rest-framework,Django,Forms,Django Rest Framework,因此,我有一个基于类的view views/users.py,其中POST应该将表单中的数据发送到序列化程序以进行验证,如果可以,则创建用户并返回数据,但由于某种原因,它返回404错误请求 以下是观点: class UserSignUpAPIView(APIView): """ User sign up API view. """ permission_classes = [AllowAny] renderer_
class UserSignUpAPIView(APIView):
""" User sign up API view. """
permission_classes = [AllowAny]
renderer_classes = [TemplateHTMLRenderer]
template_name = 'users/signup.html'
def get(self, request):
serializer = UserSignUpSerializer
return Response({'serializer': serializer,})
def post(self, request, *args, **kwargs):
""" Handle HTTP POST request. """
serializer = UserSignUpSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
user = serializer.save()
data = UserModelSerializer(user).data
return Response(data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
get函数工作正常,它返回模板,但当我提交表单时,它返回404错误请求
我的序列化程序是以下序列化程序/users.py
class UserSignUpSerializer(serializers.Serializer):
""" User sign up serializer.
Handle sign up data validation and user creation.
"""
email = serializers.EmailField(
validators=[UniqueValidator(queryset=User.objects.all())]
)
username = serializers.CharField(
min_length=4,
max_length=20,
validators=[UniqueValidator(queryset=User.objects.all())]
)
password = serializers.CharField(
min_length=8,
max_length=64
)
password_confirmation = serializers.CharField(
min_length=8,
max_length=64
)
first_name = serializers.CharField(
min_length=2,
max_length=30
)
last_name = serializers.CharField(
min_length=2,
max_length=30
)
birth_date = serializers.DateField()
def validate(self, data):
""" Check that passwords match.
Check that age of the user is over 16.
"""
print('validate')
# birth date validation
dob = data['birth_date']
print(dob)
today = date.today()
if (dob.year + 16, dob.month, dob.day) > (today.year, today.month, today.day):
raise serializers.ValidationError('Must be at least 16 years old to register.')
print('dob validated')
# password validation
passwd = data['password']
passwd_conf = data['password_confirmation']
if passwd != passwd_conf:
raise serializers.ValidationError("Passwords don't match.")
password_validation.validate_password(passwd)
print('password validated')
return data
def create(self, data):
""" Handle user creation. """
data.pop('password_confirmation')
user = User.objects.create_user(**data)
'user created'
return user
模板如下所示
{% extends 'users/base.html' %}
{% load rest_framework %}
{% block head_content %}
<title> Sign up </title>
{% endblock %}
{% block container %}
<h3>Sign up here! </h3>
<form action="{% url 'users:signup' %}" method="POST">
{% csrf_token %}
{% render_form serializer %}
<button class="btn btn-primary btn-block mt-5" type="submit"> Register </button>
</form>
<p class="mt-4"> Have an account already? <a href="{% url "users:login" %}">Log in here. </a></p>
{% endblock %}
我像这样编辑了post函数,它起了作用:
def post(self, request, *args, **kwargs):
""" Handle HTTP POST request. """
serializer = UserSignUpSerializer(data=request.data)
if not serializer.is_valid(raise_exception=True):
return Response({'serializer': serializer,})
serializer.save()
return redirect('users:login')
我试图模拟文档中的内容
def post(self, request, *args, **kwargs):
""" Handle HTTP POST request. """
serializer = UserSignUpSerializer(data=request.data)
if not serializer.is_valid(raise_exception=True):
return Response({'serializer': serializer,})
serializer.save()
return redirect('users:login')