Django получает ошибку Keyerror при установке прав доступа в CustomUserAdmin

Здравствуйте, я новичок в Python/Django и у меня проблема с реализацией разрешения. Я также скопировал это из учебника, но, похоже, это не работает в моем приложении.

Чего я хочу добиться: Речь идет о модуле администратора. Там я хочу, чтобы только администраторы могли изменять одноименное поле. Если только пользователь или сотрудник вошел в систему, это поле должно быть выделено серым цветом. со следующим кодом, это также прекрасно работает. Однако, если я затем новый пользователь затем создать / добавить я получаю Keyerror, который также ссылается на встроенный код.

Прилагаю сегменты моего кода вопроса, которые относятся к теме:

admin.py

from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from .forms import CustomUserCreationForm, CustomUserChangeForm
from .models import JobTitle, JobSkill, SkillSet


CustomUser = get_user_model()

@admin.register(CustomUser)
class CustomUserAdmin(UserAdmin):
   # see tutorial to this stuff: https://www.youtube.com/watch?v=wlYaUvfXJDc
def get_form(self, request, obj=None, **kwargs):
    form = super().get_form(request, obj, **kwargs)
    is_superuser = request.user.is_superuser

    if not is_superuser:
        form.base_fields["is_superuser"].disabled = True
        form.base_fields["user_permissions"].disabled = True
        form.base_fields["groups"].disabled = True
    return form

add_form = CustomUserCreationForm
form = CustomUserChangeForm
model = CustomUser
readonly_fields = ["last_login", "date_joined"]
list_display = [
    "username",
    "employed",
    "email",
    "job_title",
    "is_active",
    "is_staff",
    "is_superuser",
]

fieldsets = (
    (
        None,
        {
            "fields": (
                "username",
                "password",
                "first_name",
                "last_name",
            )
        },
    ),
    (
        "Persönliche Information",
        {
            "fields": ("birth_date", "employed", "job_title", "skill_set"),
        },
    ),
    (
        "Adresse und Kontakt",
        {
            "classes": ("collapse",),
            "fields": (
                "email",
                "mobile_number",
                "phone_number",
                "street_name",
                "street_number",
                "zip_code",
                "city",
                "country",
            ),
        },
    ),
    (
        "Berechtigungen",
        {
            "classes": ("collapse",),
            "fields": (
                "is_active",
                "is_staff",
                "is_superuser",
                "groups",
                "user_permissions",
            ),
        },
    ),
    (
        "Anmelde Daten",
        {
            "classes": ("collapse",),
            "fields": (
                "last_login",
                "date_joined",
            ),
        },
    ),
)


class JobTitleAdmin(admin.ModelAdmin):
    readonly_fields = ("created_at", "updated_at")


admin.site.register(JobTitle, JobTitleAdmin)
admin.site.register(JobSkill)
admin.site.register(SkillSet)

В Учебнике приведен следующий код, объясненный примерно на 52 минуте.

Мой admin.py работает нормально до того, как я применил этот код:

    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        is_superuser = request.user.is_superuser

    if not is_superuser:
        form.base_fields["is_superuser"].disabled = True
        form.base_fields["user_permissions"].disabled = True
        form.base_fields["groups"].disabled = True
    return form

При запуске программы сначала все работает. только когда я хочу добавить нового пользователя как вошедшего в систему, я получаю следующее сообщение об ошибке

KeyError at /admin/people/customuser/add/

'is_superuser'

Request Method:     GET
Request URL:    http://localhost:8000/admin/people/customuser/add/
Django Version:     4.1.5
Exception Type:     KeyError
Exception Value:    

'is_superuser'

Exception Location:     /cpp_base/people/admin.py, line 25, in get_form
Raised during:  django.contrib.auth.admin.add_view
Python Executable:  /usr/local/bin/python
Python Version:     3.10.4
Python Path:    

['/cpp_base',
 '/usr/local/lib/python310.zip',
 '/usr/local/lib/python3.10',
 '/usr/local/lib/python3.10/lib-dynload',
 '/usr/local/lib/python3.10/site-packages']

последними строками трассировки являются:

File "/usr/local/lib/python3.10/site-packages/django/utils/decorators.py", line 133, in
_wrapped_view
response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python3.10/site-packages/django/contrib/admin/options.py", line
1750, in changeform_view
return self._changeform_view(request, object_id, form_url, extra_context)
File "/usr/local/lib/python3.10/site-packages/django/contrib/admin/options.py", line 
1786, in _changeform_view
ModelForm = self.get_form(
File "/cpp_base/people/admin.py", line 25, in get_form
form.base_fields["is_superuser"].disabled = True
KeyError: 'is_superuser'

кто может мне помочь, пожалуйста, спасибо

вот решение, мне нужно добавить этот цикл проверки for в мой CustomUserAdmin

@admin.register(CustomUser)
class CustomUserAdmin(UserAdmin):
    # see tutorial to this stuff: https://www.youtube.com/watch?v=wlYaUvfXJDc
    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        is_superuser = request.user.is_superuser

        if not is_superuser:
            disabled_fields = {"is_superuser", "user_permissions", "groups", "is_staff"}
            for f in disabled_fields:
                if f in form.base_fields:
                    form.base_fields[f].disabled = True
        return form
Вернуться на верх