【问题标题】:Add attribute to admin model Django将属性添加到管理模型 Django
【发布时间】:2021-12-30 18:58:31
【问题描述】:

我正在尝试向我的用户管理模型添加一个属性,但它不起作用,

这是我成功的做法(我想添加非活动字段):

    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',
)

【问题讨论】:

  • 您是否运行迁移以同步数据库中的模型...?
  • @AbubakariUmarblacKrussainUma 是的迁移 --fake
  • 我想这就是为什么它不起作用,我建议你进入根目录迁移并删除所有迁移,然后将其同步回数据库,然后一切都应该从那里开始! --fake 迁移实际上不会使迁移在您的数据库中同步。

标签: django django-models django-rest-framework django-admin


【解决方案1】:

请进入您的根目录并从根目录中删除所有迁移,只留下 init 文件,然后返回您的命令控制台并应用迁移,然后再使用 migrate 将其同步到您的数据库。您的问题似乎来自 --fake 迁移,因为它实际上并未将其同步到数据库。

【讨论】:

  • 谢谢你的回答,我完全按照你说的做了,但是没有用!我正在使用 PostgreeSQL,我检查了表,它们不包含我添加的属性
  • 嗯 PostgreSQL 有时会很复杂,如果您的数据库中没有任何重要数据,我想您删除整个数据库并在应用迁移之前创建一个新数据库。当你这样做时它应该工作。请注意!不是假迁移!!
  • 谢谢你的帮助,虽然它没有解决我的问题,但我发现在我的视图 (TokenView) 中我引用的是 Auth 用户,而不是我的模型中的用户模型。
【解决方案2】:

我发现在我的视图 (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

【讨论】:

    猜你喜欢
    • 2012-10-12
    • 2015-08-28
    • 2016-02-18
    • 2018-06-27
    • 2023-04-08
    • 2016-03-08
    • 2016-01-24
    • 2018-09-13
    • 1970-01-01
    相关资源
    最近更新 更多