From 0d574a92a90ada2625cb2c0f367b026401b36d34 Mon Sep 17 00:00:00 2001 From: Husanjonazamov Date: Tue, 17 Mar 2026 18:25:20 +0500 Subject: [PATCH] use modeliga avatar fieldni qoshildi --- core/apps/accounts/admin/user.py | 13 ++++++++++++- .../accounts/migrations/0003_user_avatar.py | 18 ++++++++++++++++++ core/apps/accounts/models/user.py | 1 + core/apps/accounts/serializers/user.py | 3 ++- core/apps/accounts/views/auth.py | 7 ++++++- 5 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 core/apps/accounts/migrations/0003_user_avatar.py diff --git a/core/apps/accounts/admin/user.py b/core/apps/accounts/admin/user.py index 5c2d0f9..9d212d3 100644 --- a/core/apps/accounts/admin/user.py +++ b/core/apps/accounts/admin/user.py @@ -1,5 +1,6 @@ from django.contrib.auth import admin from django.utils.translation import gettext_lazy as _ +from django.utils.safestring import mark_safe from unfold.admin import ModelAdmin from unfold.forms import AdminPasswordChangeForm # UserCreationForm, from unfold.forms import UserChangeForm @@ -10,6 +11,7 @@ class CustomUserAdmin(admin.UserAdmin, ModelAdmin): # add_form = UserCreationForm form = UserChangeForm list_display = ( + "display_avatar", "first_name", "last_name", "phone", @@ -17,7 +19,7 @@ class CustomUserAdmin(admin.UserAdmin, ModelAdmin): ) search_fields = ("phone", "first_name", "last_name", "username") autocomplete_fields = ["groups", "user_permissions"] - fieldsets = ((None, {"fields": ("phone",)}),) + ( + fieldsets = ((None, {"fields": ("phone", "avatar",)}),) + ( (None, {"fields": ("username", "password")}), (_("Personal info"), {"fields": ("first_name", "last_name", "email")}), ( @@ -36,6 +38,15 @@ class CustomUserAdmin(admin.UserAdmin, ModelAdmin): (_("Important dates"), {"fields": ("last_login", "date_joined")}), ) + def display_avatar(self, obj): + if obj.avatar: + return mark_safe( + f'' + ) + return _("No Image") + + display_avatar.short_description = _("Avatar") + class PermissionAdmin(ModelAdmin): list_display = ("name",) diff --git a/core/apps/accounts/migrations/0003_user_avatar.py b/core/apps/accounts/migrations/0003_user_avatar.py new file mode 100644 index 0000000..023939a --- /dev/null +++ b/core/apps/accounts/migrations/0003_user_avatar.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.7 on 2026-03-17 12:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('accounts', '0002_alter_user_role'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='avatar', + field=models.ImageField(blank=True, null=True, upload_to='avatars/'), + ), + ] diff --git a/core/apps/accounts/models/user.py b/core/apps/accounts/models/user.py index d49fe0c..d6e375f 100644 --- a/core/apps/accounts/models/user.py +++ b/core/apps/accounts/models/user.py @@ -16,6 +16,7 @@ class User(auth_models.AbstractUser): choices=RoleChoice, default=RoleChoice.USER, ) + avatar = models.ImageField(upload_to="avatars/", null=True, blank=True) USERNAME_FIELD = "phone" objects = UserManager() diff --git a/core/apps/accounts/serializers/user.py b/core/apps/accounts/serializers/user.py index 60f10d7..a3dbb8a 100644 --- a/core/apps/accounts/serializers/user.py +++ b/core/apps/accounts/serializers/user.py @@ -19,5 +19,6 @@ class UserUpdateSerializer(serializers.ModelSerializer): model = get_user_model() fields = [ "first_name", - "last_name" + "last_name", + "avatar" ] diff --git a/core/apps/accounts/views/auth.py b/core/apps/accounts/views/auth.py index fff686d..984211b 100644 --- a/core/apps/accounts/views/auth.py +++ b/core/apps/accounts/views/auth.py @@ -6,7 +6,7 @@ from django.contrib.auth import get_user_model from django.utils.translation import gettext_lazy as _ from django_core import exceptions from drf_spectacular.utils import extend_schema -from rest_framework import status, throttling, request +from rest_framework import status, throttling, request, parsers from rest_framework.response import Response from rest_framework.exceptions import PermissionDenied from rest_framework.viewsets import GenericViewSet @@ -160,6 +160,11 @@ class ResetPasswordView(BaseViewSetMixin, GenericViewSet, UserService): @extend_schema(tags=["me"]) class MeView(BaseViewSetMixin, GenericViewSet, UserService): permission_classes = [IsAuthenticated] + parser_classes = ( + parsers.MultiPartParser, + parsers.FormParser, + parsers.JSONParser, + ) def get_serializer_class(self): match self.action: