Добавление атрибута к модели администратора Django
Я пытаюсь добавить атрибут к моей модели администратора пользователя, но это не работает,
вот что мне удалось сделать (я хочу добавить поле бездействия):
from django.contrib import admin
from .models import User
class usersAdmin(admin.ModelAdmin):
list_display = ('username', 'first_name', 'last_name', 'inactivity')
admin.site.register(User, usersAdmin)
Вот код моей модели:
class User(models.Model):
username = models.TextField(max_length=140, default='uid', primary_key=True)
first_name = models.TextField(max_length=140, default='cn')
last_name = models.TextField(max_length=140, default='givenName')
inactivity = models.IntegerField(default=500)
def _str_(self):
return self
Ошибка возникает, когда я пытаюсь получить доступ к добавленному полю из моих представлений:
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
def validate(self, attrs):
data = super().validate(attrs)
data['username'] = self.user.username
data['first_name'] = self.user.first_name
data['last_name'] = self.user.last_name
data['inactivity'] = self.user.inactivity
print(self.user)
return data
ошибка говорит:
Traceback (most recent call last):
File "C:\Users\oussa\.virtualenvs\SYNEIKA-v3YFud-O\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\oussa\.virtualenvs\SYNEIKA-v3YFud-O\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\oussa\.virtualenvs\SYNEIKA-v3YFud-O\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "C:\Users\oussa\.virtualenvs\SYNEIKA-v3YFud-O\lib\site-packages\django\views\generic\base.py", line 70, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\oussa\.virtualenvs\SYNEIKA-v3YFud-O\lib\site-packages\rest_framework\views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "C:\Users\oussa\.virtualenvs\SYNEIKA-v3YFud-O\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "C:\Users\oussa\.virtualenvs\SYNEIKA-v3YFud-O\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
raise exc
File "C:\Users\oussa\.virtualenvs\SYNEIKA-v3YFud-O\lib\site-packages\rest_framework\views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "C:\Users\oussa\.virtualenvs\SYNEIKA-v3YFud-O\lib\site-packages\rest_framework_simplejwt\views.py", line 27, in post
serializer.is_valid(raise_exception=True)
File "C:\Users\oussa\.virtualenvs\SYNEIKA-v3YFud-O\lib\site-packages\rest_framework\serializers.py", line 220, in is_valid
self._validated_data = self.run_validation(self.initial_data)
File "C:\Users\oussa\.virtualenvs\SYNEIKA-v3YFud-O\lib\site-packages\rest_framework\serializers.py", line 422, in run_validation
value = self.validate(value)
File "C:\Users\oussa\OneDrive\Documents\GitHub\SYNEIKA\backend\ldapapp\views.py", line 85, in validate
data['inactivity'] = self.user.inactivity
AttributeError: 'User' object has no attribute 'inactivity'
PS: Я использую LDAP auth backend в set.py У меня есть:
import ldap
from django_auth_ldap.config import LDAPSearch, LDAPGroupQuery,PosixGroupType
AUTH_LDAP_SERVER_URI = 'ldap://192.0.0.1'
AUTH_LDAP_BIND_DN = 'cn=admin,dc=syneika,dc=com'
AUTH_LDAP_BIND_PASSWORD = '123'
AUTH_LDAP_USER_SEARCH = LDAPSearch('ou=users,dc=syneika,dc=com',ldap.SCOPE_SUBTREE, '(uid=%(user)s)')
AUTH_LDAP_GROUP_SEARCH = LDAPSearch('ou=groups,dc=syneika,dc=com',ldap.SCOPE_SUBTREE, '(objectClass=top)')
AUTH_LDAP_GROUP_TYPE = PosixGroupType(name_attr="cn")
AUTH_LDAP_MIRROR_GROUPS = True
# Populate the Django user from the LDAP directory.
AUTH_LDAP_REQUIRE_GROUP = (
LDAPGroupQuery("cn=Active,ou=groups,dc=syneika,dc=com")
)
AUTH_LDAP_USER_ATTR_MAP = {
"first_name": "givenName",
"last_name": "sn",
"email": "mail",
"username": "uid",
"password": "userPassword"
}
AUTH_LDAP_PROFILE_ATTR_MAP = {
"home_directory": "homeDirectory"
}
AUTH_LDAP_USER_FLAGS_BY_GROUP = {
"is_active": (
LDAPGroupQuery("cn=Active,ou=groups,dc=syneika,dc=com")
),
"is_staff": (
LDAPGroupQuery("cn=Staff,ou=groups,dc=syneika,dc=com")
),
"is_superuser": (
LDAPGroupQuery("cn=Superuser,ou=groups,dc=syneika,dc=com")
)
}
AUTH_LDAP_ALWAYS_UPDATE_USER = True
AUTH_LDAP_FIND_GROUP_PERMS = True
AUTH_LDAP_CACHE_TIMEOUT = 3600
AUTH_LDAP_FIND_GROUP_PERMS = True
# Keep ModelBackend around for per-user permissions and maybe a local
# superuser.
AUTHENTICATION_BACKENDS = (
'django_auth_ldap.backend.LDAPBackend',
'django.contrib.auth.backends.ModelBackend',
)
Пожалуйста, зайдите в корневой каталог и удалите все миграции из корневого каталога, оставив только файл init, затем вернитесь в командную консоль и примените миграции, прежде чем синхронизировать их с базой данных с помощью migrate. Ваша проблема, похоже, возникает из-за - fake migrate, поскольку он не синхронизирует его с базой данных.
Я понял, что в моем представлении (TokenView) я ссылаюсь на пользователя Auth, а не на модель User в моих моделях.
Итак, чтобы добавить другие атрибуты к аутентифицирующему пользователю (предоставляемые Django по умолчанию), я должен связать пользователя Auth с другой моделью и добавить атрибуты, которые я хочу, я нашел это здесь : Django Profiles
from django.db import models
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
activity = models.IntegerField(default=500)
def _str_(self):
return self