Search code examples
pythondjangodjango-adminmodels

Trying to add banned user into table, Django ADMIN


I have a function that bans users in my Admin User Model View.But i am unsure of how to then add that banned user to the Banned_User model.

#Banning function
def ban_users(self, request, queryset):
    queryset.update(is_active = False)
    banned_user = Banned_User.objects.create(profile=profile)
    banned_user.save()
    self.message_user(request, "User banned")

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

#Profile Admin view
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')

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

admin.site.register(Profile, ProfileAdmin)

#User Admin View
class MyUserAdmin(UserAdmin):
    list_display = ('profileview','username', 'first_name', 'last_name' , 'email')
    readonly_fields = ('first_name' , ('last_name') , ('email') , ('username'))
    actions = ['ban', 'unban']
    ban = ban_users
    unban = remove_ban

    def profileview(self, instance):
        return instance.profile.user

admin.site.unregister(User)  
admin.site.register(User, MyUserAdmin)

(Profile model has a OneToOneField to User)

My Banning User Model is as follows:

class Banned_User(models.Model):
    def __str__(self):
        return self.user.get_username

    profile = models.ForeignKey(
        'Profile',
        on_delete=models.PROTECT,
        blank=False,
        null=False,
        related_name='banned_profile'
    )

    report_reason = models.ForeignKey(
        'report',
        on_delete=models.PROTECT,
        blank=False,
        null=False,
        related_name='reason_banned',
    )

    date_banned = models.DateField(null=True, blank=False,)

current errors are: name 'profile' is not defined but i am not sure if my code to add to the table is right either way.


Solution

  • def ban_users(modeladmin, request, queryset):
        queryset.update(is_active = False)
        banned_user = Banned_User.objects.create(profile=request.user.profile)
        banned_user.save()
        self.message_user(request, "User banned")
    
    def remove_ban(modeladmin, request, queryset):
        print(queryset)
        queryset.update(is_active = True)
        self.message_user(request, "Users ban has been lifted")
    

    make sure the upper functions are written in this admin.py file or import it

    class MyUserAdmin(UserAdmin):
        list_display = ('profileview','username', 'first_name', 'last_name' , 'email')
        readonly_fields = ('first_name' , ('last_name') , ('email') , ('username'))
        actions = [ban, unban]
    
        def profileview(self, instance):
            return instance.profile.user
    
    admin.site.unregister(User)  
    admin.site.register(User, MyUserAdmin)
    

    check the changes in the function inputs and the action of the ModelAdmin