Basilio Cristov
Basilio Cristov

Reputation: 1

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

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

Upvotes: 0

Views: 1096

Answers (2)

Hardik Gosara
Hardik Gosara

Reputation: 21

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)

Upvotes: 2

Fateme Fouladkar
Fateme Fouladkar

Reputation: 190

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.

Upvotes: 0

Related Questions