2017-09-13 2 views
2

Ich versuche, eine API für die Benutzerregistrierung mit dem Django Rest Framework zu erstellen. die folgende models.py DateiBenutzerregistrierung mit Django Rest Framework

from __future__ import unicode_literals 
from django.db import models 
from django.contrib.auth.models import User 
from django.db.models.signals import post_save 
from django.dispatch import receiver 


class UserProfile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE , primary_key = True) 
    mobileNumber = models.IntegerField(default=0) 
    avatar= models.ImageField(upload_to = 'User/' , default = '/static/User/defaultProfileImage.png') 


def create_user_profile(sender, **kwargs): 
    if kwargs['created']: 
     profile = UserProfile.objects.create(user=kwargs['instance']) 


post_save.connect(create_user_profile, sender=User) 


Ich habe Dies ist mein Serializers.py Datei

from rest_framework import serializers 
from User.models import UserProfile 
from django.contrib.auth.models import User 





class UserSerializer(serializers.HyperlinkedModelSerializer): 
    username = serializers.CharField() 
    password1 = serializers.CharField(
     style={'input_type': 'password'}, 
     write_only=True) 
    password2 = serializers.CharField(
     style={'input_type': 'password'}, 
     write_only=True) 
    email = serializers.EmailField() 
    class Meta: 
     model = User 
     fields = (
      'id', 
      'username', 
      'password1', 
      'password2', 
      'email', 
      'first_name', 
      'last_name', 
      ) 

class UserProfileSerializer(serializers.HyperlinkedModelSerializer): 
    user = UserSerializer() 
    class Meta: 
     model = UserProfile 
     fields = (
      'user', 
      'mobileNumber', 
      'avatar') 

Und finden Sie meine views.py Datei

from User.models import UserProfile 
from .serializers import UserProfileSerializer 
from rest_framework.viewsets import ModelViewSet 


class UserProfileViewSet(ModelViewSet): 
    queryset = UserProfile.objects.all() 
    serializer_class = UserProfileSerializer 

Was ist der beste Weg, um eine User-Registrierung mit der API-Ansicht t zu erstellen? Hut ich habe erstellt. Ich habe viele Alternativen ausprobiert wie überschreiben der create-Methode in der UserProfile Serializer-Klasse und auch drf-schreibbar-geschachtelt, aber Fehler bekommen.
Bitte schlagen Sie mir einen Ausweg vor. Ich möchte auch, dass die API Benutzer registrieren kann, wenn sie von einer Android-App aufgerufen wird.

+0

anstatt deine eigene Registrierung auszurollen, warum nutzt du nicht einfach die verfügbaren Pakete für die Registrierung wie Django-RestAuth oder django-knox. Schau hier. http://www.django-rest-framework.org/api-guide/authentication/ –

Antwort

0

Sie können dies in Ihrer Serializers.py Datei tun, sollte dies funktionieren.

class UserSerializer(serializers.HyperlinkedModelSerializer): 
    mobileNumber = serializers.IntegerField() 
    avatar= serializers.ImageField() 

    class Meta: 
     model = User 
     fields = ('username', 'first_name', 'last_name', 'email', 'password', 'mobileNumber', 'avatar') 

    def create(self, validated_data): 
     mobile_number = validated_data.pop('mobileNumber', None) 
     user = super(UserSerializer, self).create(validated_data) 
     user.set_password(raw_password=validated_data['password']) 
     user.save() 
     userprofile = user.userprofile 
     userprofile.mobileNumber = mobile_number 
     userprofile.save() 
     return user 

    def update(self, instance, validated_data): 
     mobile_number = validated_data.pop('mobileNumber', None) 
     userprofile = instance.userprofile 
     userprofile.mobileNumber = mobile_number 
     userprofile.save() 
     return super(UserSerializer, self).update(instance, validated_data) 

Chuck die UserProfileSerializer für diesen Anwendungsfall, ich fühle mich hier seine nicht wirklich nötig. Ihre views.py und models.py sehen cool zu mir. Hoffe das hilft dir :-)

Verwandte Themen