首页 > 解决方案 > 无法使用用户个人资料注册用户

问题描述

我在注册用户用户资料和患者时遇到问题,同时出现类似错误

{
    "profile": [
        "This field is required."
    ],
    "patient": [
        "This field is required."
    ]
}

bad request 400 77在我的 cmd

我不明白怎么了

我的代码

序列化器.py

    class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email')


class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ('date_of_birth',)


class PatientSerializer(serializers.ModelSerializer):
    class Meta:
        model = Patient
        fields = ('blood_type',)



class RegisterSerializer(serializers.ModelSerializer):
    profile = ProfileSerializer(required = True)
    patient = PatientSerializer(required = True)
    class Meta:
        model = User
        fields = ('id', 'username', 'email', 'password','profile','patient',)
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        profile_data = validated_data.pop('profile')
        patient_data = validated_data.pop('patient')
        user = User(**validated_data)
        username = user.username
        password = validated_data.pop('password')
        user.set_password(password)
        user.save()
        profile = Profile.objects.create(user=user,name=username,**profile_data)
        Patient.objects.create(profile=profile,**patient_data)
        return user

视图.py

class RegisterAPIView(generics.GenericAPIView):
serializer_class = RegisterSerializer

def post(self, request, *args, **kwargs):
    serializer = self.get_serializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    user = serializer.save()
    return Response({
        "user": UserSerializer(user, context=self.get_serializer_context()).data,
        "token": AuthToken.objects.create(user)[1]
    })

我的注册表在反应

class RegisterForm extends Component {
  renderField = ({ input, label,className, type, meta: { touched, error } }) => {
    return (
      <div className={`field ${touched && error ? 'error' : ''}`}>
        <label>{label}</label>
        <input {...input} type={type} className={"form-control"} />
        {touched && error && (
          <span className='ui pointing red basic label'>{error}</span>
        )}
      </div>
    );
  };

  onSubmit = formValues => {
    this.props.register(formValues);
  };

  render() {
    if (this.props.isAuthenticated) {
      return <Redirect to='/' />;
    }
    return (
      <div className='ui container'>
        <div className='ui segment'>
          <form
            onSubmit={this.props.handleSubmit(this.onSubmit)}
            className='ui form'
          >
            <Field
              name='username'
              type='text'
              component={this.renderField}
              label='Your Name'
              validate={[required, minLength3, maxLength15]}
            />
            <Field
              name='email'
              type='email'              
              component={this.renderField}
              label='Email'
              validate={required}
            />
            <Field
              name='password'
              type='password'
              component={this.renderField}
              label='Password'
              validate={required}
            />
            <Field
              name='password2'
              type='password'
              component={this.renderField}
              label='Confirm Password'
              validate={[required, passwordsMatch]}
            />
              <Field
              name='date_of_birth'
              type='date'
              component={this.renderField}
              label='YOUR BIRTH DATE'
              validate={[required, minDate1899,MaxDate]}
            />
            <Field name='Blood_type'
            type='text'
            component={"select"}
            label='Your Blood Type'
            style={{ marginRight: '1rem' }}
            validate={[required]}>
              <option>Your Blood Type</option>
                <option value="1-">1-</option>
                <option value="1+">1+</option>
                <option value="2-">2-</option>
                <option value="2+">2+</option>
                <option value="3+">3+</option>
                <option value="3-">3-</option>
                <option value="4-">4-</option>
                <option value="4+">4+</option>
            </Field>

            <button style={{ marginTop: '1rem' }} className='btn btn-primary'>Register</button>
          </form>
          <p style={{ marginTop: '1rem' }}>
            Already have an account? <Link to='/login'>Login</Link>
          </p>
        </div>
      </div>
    );
  }
}

以及我在 auth.js 中的注册方法

/ REGISTER USER
export const register = ({ username, email, password,date_of_birth,blood_type }) => async dispatch => {
  // Headers
  const config = {
    headers: {
      'Content-Type': 'application/json'
    }
  };

  // Request Body
  const body = JSON.stringify({ username, email, password,date_of_birth,blood_type});

  try {
    const res = await axios.post('http://127.0.0.1:8000/api/register', body, config);
    dispatch({
      type: REGISTER_SUCCESS,
      payload: res.data
    });
  } catch (err) {
    dispatch({
      type: REGISTER_FAIL
    });
    dispatch(stopSubmit('registerForm', err.response.data));
  }
};

标签: pythondjangopython-3.xreactjsdjango-rest-framework

解决方案


推荐阅读