将属性添加到管理模型 Django

Add attribute to admin model 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:我在 setting.py 中使用 LDAP 身份验证后端 我有:

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 文件,然后返回您的命令控制台并应用迁移,然后再将其同步到您的数据库迁移。您的 from 问题似乎来自 --fake migrate,因为它实际上并未将其同步到数据库。

我发现在我的视图 (TokenView) 中,我指的是 Auth 用户而不是模型中的用户模型。

所以要为 Authenticating 用户添加另一个属性(默认由 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