Django Password not encrypted, custom user model using (AbstractUser)

681 views Asked by At

In Django I have replaced the user model using (AbstractUser). Then in the admin panel area the fields are unordered. When generating a new user, the password is not encrypted, the user is saved with the password unencrypted. But then I can't access the admin panel. Returning error the username or password do not match.

In model.py

# from django.contrib.auth import get_user_model
from django.contrib.auth.models import AbstractUser
from django.db import models

# UserModel = get_user_model()

class UserAgent_mod(AbstractUser):

    phone_number = models.CharField(
        max_length=9,
        blank=True,
        null=True,
    )

    profile_image = models.ImageField(
        upload_to='photos_user_agent',
    )

    manage_properties = models.ManyToManyField(
        to='property_app.Property_mod',
        related_name='manage_properties',
        blank=True

    )

    def __str__(self):
        return f'{self.first_name} {self.last_name}'

    class Meta:
        verbose_name='User Agent'
        verbose_name_plural = 'Users Agents'

In admin.py

from django.contrib import admin
from django.contrib.auth import get_user_model

UserModel = get_user_model()

@admin.register(UserModel)
class UserAgentAdmin(admin.ModelAdmin):
    list_display = (
        'username',
        'first_name',
        'last_name',
        'phone_number',
        'email',
    )

    list_filter = (
        'first_name',
        'last_name',
    )

in settings.py

AUTH_USER_MODEL= 'user_agent_app.UserAgent_mod'

Demo result of the problem

2

There are 2 answers

0
Hardik Gosara On

put the following code in your admin.py file:

from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAgent_mod as BaseUserAdmin

class UserAgentAdmin(BaseUserAdmin):
    fieldsets = BaseUserAdmin.fieldsets
    ADDITIONAL_USER_FIELDS = (
        (None, {'fields': ('phone_number','profile_image','manage_properties')}),
    )
    fieldsets = fieldsets + ADDITIONAL_USER_FIELDS
    list_display = (
        'username',
        'first_name',
        'last_name',
        'phone_number',
        'email',
    )

    list_filter = (
        'first_name',
        'last_name',
    )

admin.site.register(get_user_model, UserAgentAdmin)
2
Fateme Fouladkar On

Whan you use AbstarctUser and you need to add users via the django admin panel, you should also use the UserCreationForm and UserChangeForm, so the password will be encrypted.

To do so, make a forms.py file in your users application and add the following code to it:

from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import UserAgent_mod

class UserCreationForm(UserCreationForm):

# If you want to give superuser privileges to the staff users, override the save method 
    def save(self, commit=True):
        user = self.instance
        if user.is_staff:   
            user.is_superuser = True
        return super().save(commit=True)

    class Meta:
        model = UserAgent_mod
        fields = ('email', 'first_name', 'last_name') # add any other field you want


class UserChangeForm(UserChangeForm):
    class Meta:
        model = UserAgent_mod
        fields = ('email', 'first_name', 'last_name') # add any other field you want

Also add the below code to your admin.py:

(change the fields as you want to)

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .forms import UserCreationForm, UserChangeForm
from .models import UserAgent_mod


class UserAdmin(UserAdmin):
    add_form = UserCreationForm
    form = UserChangeForm
    model = UserAgent_mod
    list_display = ('email', 'is_staff', 'is_active',)
    list_filter = ('email', 'is_staff', 'is_active',)
    fieldsets = (
        (None, {'fields': ('email', 'password', 'first_name', 'last_name')}),
        ('Permissions', {'fields': ('is_staff', 'is_active')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'password1', 'password2', 'first_name', 'last_name', 'is_staff', 'is_active')}
        ),
    )
    search_fields = ('email',)
    ordering = ('email',)


admin.site.register(UserAgent_mod, UserAdmin)

You can read more about AbstractUser in this article.