DRF: имя пользователя все еще требуется после настройки абстрактного пользователя - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь написать REST API, используя Django и DRF. Я пытаюсь создать пользовательскую модель и использовать ее в своем приложении. Но проблема в том, что он возвращает код ошибки 400, который гласит:

{"username": ["Это поле обязательно для заполнения."]}

Этомой код для моделей:

import uuid

from django.contrib.auth.models import AbstractUser
from django.db import models
from django.conf import settings
from django.dispatch import receiver
from django.utils.encoding import python_2_unicode_compatible
from django.db.models.signals import post_save
from rest_framework.authtoken.models import Token
from api.fileupload.models import File


@python_2_unicode_compatible
class User(AbstractUser):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    email = models.EmailField('Email address', unique=True)
    name = models.CharField('Name', default='', max_length=255)
    phone_no = models.CharField('Phone Number', max_length=255, unique=True)
    address = models.CharField('Address', default='', max_length=255)
    country = models.CharField('Country', default='', max_length=255)
    pincode = models.CharField('Pincode', default='', max_length=255)
    USERNAME_FIELD = 'email'

    REQUIRED_FIELDS = []

    def __str__(self):
        return self.email


@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

Сериализатор:

class CreateUserSerializer(serializers.ModelSerializer):
    username = None

    def create(self, validated_data):
        validated_data['username'] = uuid.uuid4()
        user = User.objects.create_user(**validated_data)
        return user


    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.address = validated_data.get('address', instance.address)
        instance.country = validated_data.get('country', instance.country)
        instance.pincode = validated_data.get('pincode', instance.pincode)
        instance.phone_no = validated_data.get('phone_no', instance.phone_no)
        instance.email = validated_data.get('email', instance.email)
        instance.save()
        return instance

    class Meta:
        unique_together = ('email',)
        model = User
        fields = (
            'id', 'password', 'email', 'name', 'phone_no', 'address', 'country', 'pincode',      
        )
        extra_kwargs = {'password': {'write_only': True}}

Файл Admin.py:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User


@admin.register(User)
class UserAdmin(UserAdmin):
    pass

Ответы [ 2 ]

1 голос
/ 15 октября 2019

class User (AbstractUser):

Поскольку ваша User модель наследует от AbstractUser , она унаследует поле username .

Просто удалите поле username из вашей модели User, установив username = None следующим образом:

class User(AbstractUser):
    # ...
    username = None
    # ...

class UserAdmin (UserAdmin):

Поскольку ваша UserAdmin модель наследует от django.contrib.auth.admin.UserAdmin , вам нужно обновить fieldsets , list_display , search_fields и упорядочивают поля в вашей UserAdmin модели, потому что они используют username, который вы удалили из вашей User модели.

0 голосов
/ 15 октября 2019

Аннотация У пользователя всегда есть поле имени пользователя. Удаление это вызовет проблемы. Я предлагаю вам сохранить адрес электронной почты пользователя в поле имени пользователя и использовать его. Пожалуйста, убедитесь, что он всегда обновляется в обоих полях, что не очень сложно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...