Попытка вызова метода is_active из внешней модели пользователя в Django ADMIN - PullRequest
0 голосов
/ 03 мая 2018

Здесь у меня есть функция, которая запрещает и отменяет запрет на пользователей. В настоящее время я могу использовать это в DjangoAdmin в моей пользовательской модели пользователя. Но я пытаюсь запретить пользователям использовать модель Profile в моем DjangoAdmin.

И все же я продолжаю получать ОШИБКА FieldDoesNotExist в / admin / api / profile /
В профиле нет поля с именем 'is_active'
, поскольку is_active является функцией модели пользователя. Я не уверен, как можно запретить пользователям доступ к представлению модели профиля в Admin или как подключить is_active к Profile Модель.

#Banning Function
 def ban_users(self, request, queryset):
     queryset.update(is_active = False)
     self.message_user(request, "User is banned and Email has been sent")

 def remove_ban(self, request, queryset):
     queryset.update(is_active = True)
     self.message_user(request, "Users ban has been lifted")

 #Admin functions will be created here,as well as registration  of their specific models

 class ReportAdmin(admin.ModelAdmin):
     list_display = ('user_reported', 'report_reason', 'sent_by', 'session')
 admin.site.register(Report, ReportAdmin)

 class ProfileAdmin(admin.ModelAdmin):
     list_display = ('user', 'birth_date', 'sessions_played', 'total_reports')
     readonly_fields = (('sessions_played'),('birth_date'),('user'),('pref_server'),('teamwork_commends'),('skill_commends'),('sportsmanship_commends'),('communication_commends'),('discord_name'))#,'total_reports')
     actions = ['ban', 'unban']
     ban = ban_users
     unban = remove_ban

 def total_reports(self, obj):
     return Report.objects.filter(user_reported=obj).count()

 admin.site.register(Profile, ProfileAdmin)

 class MyUserAdmin(UserAdmin):
     list_display = ('username', 'first_name', 'last_name' , 'email')
     readonly_fields = ('first_name' , ('last_name') , ('email') , ('username'))
     actions = ['ban', 'unban']
     ban = ban_users
     unban = remove_ban
 admin.site.unregister(User)
 admin.site.register(User, MyUserAdmin)

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Функции действий предполагают, что набор запросов всегда будет содержать User объекты, но поскольку вы используете те же функции действия для ProfileAdmin, им также необходимо обрабатывать Profile объекты.

def ban_users(self, request, queryset):
    for obj in queryset:
        if hasattr(obj, 'user'):
            # This object is a Profile, so lookup the user
            obj = obj.user
        obj.is_active = False
        obj.save()
    self.message_user(request, "User is banned and Email has been sent")

Обратите внимание, что функция queryset.update() не может использоваться для обновления столбцов на связанных моделях , поэтому вы не можете выполнить queryset.update(user__is_active = False).

0 голосов
/ 03 мая 2018

Увидев ваши коды, взгляните на то, что пришло мне в голову.
непроверенная теория

, поскольку is_active является полем User, имея queryset, мы можем проверить, является ли оно Queryset из User или Profile.

зная, что профиль имеет обычного OneToOneField для пользователя, как я вижу во многих проектах

def ban_users(self, request, queryset):
    # select an instance from queryset
    instance = queryset.first()
    if instance.__class__.__name__ == 'Profile'
        queryset.update(user__is_active = False)
    else:
        queryset.update(is_active = False)
    self.message_user(request, "User is banned and Email has been sent")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...