Переименовать Django Пользовательские поля - PullRequest
0 голосов
/ 09 октября 2019

Я создаю API, используя Django. Мне нужно создать логин для пользователей. Поэтому я использовал класс Django User по умолчанию и аутентификацию для этого.
Но есть проблема. API для входа (в / users / login / endpoint) определяется в следующем формате: {"user": value, "pass": value}.
И модель User, заданная Django, имеет два важных поля: "username" и "password".
Как я уже говорил, я хочу, чтобы они были "user" вместо "username" и "pass" вместо "password". Потому что именно так будет выглядеть JSON в запросах POST во внешнем интерфейсе.
Я знаю, что могу создать RenameField, но это только изменит имя столбца в базе данных, но не изменит запрос Django. имя пользователя и пароль в теле запроса POST.

Мне нужно отправить (в запросе POST в почтальоне) JSON в / users / login / endpoint в следующем формате: {"user": value, "pass": value}.
Но модель Django User не знает, что это за поля, ей не нужен пользователь, ей нужно имя пользователя, ей не нужно проходить, ей нужен пароль, поэтому я получаю сообщение об ошибке.
IНужно как-то изменить ключи «user» и «pass» в данном JSON на «username» и «password». Или изменить имена полей в пользовательской модели. В противном случае ответ будет:

{
    "username": [
        "This field is required."
    ],
    "password": [
        "This field is required."
    ]
}

Потому что, как я уже сказал, Django получает «user» и «pass», и он не распознает эти ключи ... Ему нужны «username» и"пароль" поля.
т.е.: мне нужно как-то изменить с:

{
    "user": value,
    "pass": value
}

на:

{
    "username": value,
    "password": value
}

Или наоборот.
Я пытался не создаватьмоя собственная модель пользователя, и использовать модель, заданную Django, я думаю, что создавать ее не очень хорошая идея ...
Я думаю, что могу добавить новый файл с именем serializer.py и что-то сделать там, но яне знаю как, и я ничего не нашел в документации.

Если они полезны, это мои файлы.
urls.py:

from rest_framework.authtoken.views import obtain_auth_token
from django.contrib import admin
from catanAPI.catan import views
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('users/login/', obtain_auth_token)
]

settings.py

INSTALLED_APPS = [
    #...
    'django.contrib.auth',
    'rest_framework',
    'rest_framework.authtoken'
    #...
]

AUTH_USER_MODEL = 'auth.User'

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ]
}

Я знаю, что этот вопрос можетбыть глупым или что-то в этом роде, но я новичок в Джанго и пытаюсь учиться.

Ответы [ 2 ]

3 голосов
/ 09 октября 2019

Я думаю, что вместо изменения полей модели вы должны изменить представление. Вы можете переопределить представление ObtainAuthToken, например:

from django.utils.translation import gettext as _
# serializer
class CustomAuthTokenSerializer(serializers.Serializer):
    user = serializers.CharField(label=_("User"))

    def __init__(self, *args, **kwargs):
        super(CustomAuthTokenSerializer, self).__init__(*args, **kwargs)
        self.fields['pass'] = serializers.CharField(
            label=_("Pass"),
            style={'input_type': 'password'},
            trim_whitespace=False
        )
    def validate(self, attrs):
        username = attrs.get('user')
        password = attrs.get('pass')

        if username and password:
            user = authenticate(request=self.context.get('request'),
                                username=username, password=password)

            # The authenticate call simply returns None for is_active=False
            # users. (Assuming the default ModelBackend authentication
            # backend.)
            if not user:
                msg = _('Unable to log in with provided credentials.')
                raise serializers.ValidationError(msg, code='authorization')
        else:
            msg = _('Must include "username" and "password".')
            raise serializers.ValidationError(msg, code='authorization')

        attrs['user'] = user
        return attrs

 # view
 from rest_framework.authtoken.views import ObtainAuthToken

 class CustomObtainAuthToken(ObtainAuthToken):
     serailizer_class = CustomAuthTokenSerializer

 # urls
 path('users/login/', CustomObtainAuthToken.as_view())
0 голосов
/ 09 октября 2019

Вы можете написать свой пользовательский пользователь:

application / models.py

from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    """
    Custom User Model 
    """

    user = models.CharField(max_length=255, unique=True)
    pass_w = models.CharField(max_length=50)
    email = models.CharField(max_length=255, unique=True)

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["user"]

    def __str__(self):
        return self.email

project / settings.py

AUTH_USER_MODEL = 'application.User'
...