I'm trying to create a new user in my Ionic app using Django as the backend. So far I can create a user no problem using Postman, but when I try to make an HTTP post request through my app I get the following error: {"password":["This field is required."],"username":["This field is required."]}
. I am passing the username
and password
field to my Django app, but for some reason it doesn't register it. Is my post call wrong?
DJANGO APP CODE
serializers.py
class UserSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True)
languages = serializers.ListField(child=serializers.CharField(max_length=30, allow_blank=True), source="userprofile.languages")
class Meta:
model = User
fields = ('first_name', 'last_name', 'email', 'username', 'password', 'languages')
def create(self, validated_data, instance=None):
profile_data = validated_data.pop('userprofile')
user = User.objects.create(**validated_data)
user.set_password(validated_data['password'])
user.save()
UserProfile.objects.update_or_create(user=user, **profile_data)
return user
views.py
@api_view(['POST'])
@permission_classes((AllowAny,))
def create_user(request):
serialized = UserSerializer(data=request.data)
if serialized.is_valid():
serialized.save()
return Response(serialized.data, status=status.HTTP_201_CREATED)
else:
return Response(serialized._errors, status=status.HTTP_400_BAD_REQUEST)
IONIC APP CODE
http.ts
register(username, password, email, first_name, last_name, languages) {
let url = "https://www.example.com/api/create_user/";
let headers = new Headers()
headers.append("Content-Type", "application/x-www-form-urlencoded");
return this.http.post(url,
{"first_name": first_name,
"last_name": last_name,
"email": email,
"username": username,
"password": password,
"languages": languages
}, {headers: headers})
.map(res => res.json());
}
register.ts
import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { HttpProvider } from "../../providers/http/http";
@IonicPage()
@Component({
selector: 'page-register',
templateUrl: 'register.html',
})
export class RegisterPage {
//basic info
username:any;
email:any;
fname:any;
lname:any;
password:any;
passwordConfirm:any;
languages:any = [];
cantonese:any;
french:any;
german:any;
italian:any;
japanese:any;
korean:any;
mandarin:any;
portuguese:any;
russian:any;
spanish:any;
constructor(public navCtrl: NavController, public navParams: NavParams, private http: HttpProvider) {
}
ionViewDidLoad() {
console.log('ionViewDidLoad RegisterPage');
}
register() {
if(this.cantonese) {
this.languages.push("Cantonese")
}
if(this.french) {
this.languages.push("French")
}
if(this.german) {
this.languages.push("German")
}
if(this.italian) {
this.languages.push("Italian")
}
if(this.japanese) {
this.languages.push("Japanese")
}
if(this.korean) {
this.languages.push("Korean")
}
if(this.mandarin) {
this.languages.push("Mandarin")
}
if(this.portuguese) {
this.languages.push("Portuguese")
}
if(this.russian) {
this.languages.push("Russian")
}
if(this.spanish) {
this.languages.push("Spanish")
}
alert(this.username+" "+this.password);
this.http.register(this.username,
this.password,
this.email,
this.fname,
this.lname,
this.languages).subscribe((stuff) => {
console.log(stuff);
});
}
}
package.json
{
"name": "project_name",
"version": "0.0.1",
"author": "Ionic Framework",
"homepage": "http://ionicframework.com/",
"private": true,
"scripts": {
"clean": "ionic-app-scripts clean",
"build": "ionic-app-scripts build",
"lint": "ionic-app-scripts lint",
"ionic:build": "ionic-app-scripts build",
"ionic:serve": "ionic-app-scripts serve"
},
"dependencies": {
"@angular/common": "5.0.1",
"@angular/compiler": "5.0.1",
"@angular/compiler-cli": "5.0.1",
"@angular/core": "5.0.1",
"@angular/forms": "5.0.1",
"@angular/http": "5.0.1",
"@angular/platform-browser": "5.0.1",
"@angular/platform-browser-dynamic": "5.0.1",
"@ionic-native/core": "4.4.0",
"@ionic-native/splash-screen": "4.4.0",
"@ionic-native/status-bar": "4.4.0",
"@ionic/storage": "2.1.3",
"ionic-angular": "3.9.2",
"ionicons": "3.0.0",
"rxjs": "5.5.2",
"sw-toolbox": "3.6.0",
"zone.js": "0.8.18"
},
"devDependencies": {
"@ionic/app-scripts": "3.1.2",
"typescript": "2.4.2"
},
"description": "An Ionic project"
}
You want to change request.data
in your django view to request.POST
Details here: http://www.django-rest-framework.org/tutorial/2-requests-and-responses/
Specifically
request.POST # Only handles form data. Only works for 'POST' method.
request.data # Handles arbitrary data. Works for 'POST', 'PUT' and 'PATCH' methods.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.