slashmili / django-jalali

Jalali DateField support for Django model
http://pypi.python.org/pypi/django_jalali
BSD 3-Clause "New" or "Revised" License
258 stars 52 forks source link

model manager #253

Closed amirreza8002 closed 4 months ago

amirreza8002 commented 4 months ago

سلام آیا لازم هست که منیجر دیفالت objects جایگزین بشه؟ به نظرم بهتر میاد که یک اتذبیوت دیگه برای منیجر این پکیج استفاده بشه بعضا به ارور میخوره به عنوان مثال:

python3.12/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 304, in _validate_username
    self.UserModel._default_manager.db_manager(database).get_by_natural_key(
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'ManagerFromjQuerySet' object has no attribute 'get_by_natural_key'

وقتی که توی UserModel استفاده میشه

slashmili commented 4 months ago

سلام،

عجیب است که من این را ندیده ام یا کسی قبلاً آن را گزارش نکرده است

لطفاً ذکر کن که از کدام نسخه django، django-jalali استفاده می کنی، همچنین کدی برای بازتولید مشکل ارائه دهید.

با تشکر!

amirreza8002 commented 4 months ago

سلام، امیدوارم گندکاری من نباشه پس :) https://github.com/amirreza8002/django-med

این کد

django=5.0.7 django-allauth=0.64.6 django-jalali=7.0.0

بقیه پکیج ها رو هم میتونید تو فایل pyproject.yaml ببینید با دستور python manage.py createsuperuser و وارد کردن نام کاربری ارور میده

اگر موقع مایگریت خطا داد flatpages رو از لیست INSTALLED_APPS پاک کنید

دیتابیس روی پستگرس تنظیم شده، برای تغییر django_project/conf/base.py رو ادیت کنید اکه دیتابیس رو عوض کردید و خطا داد فایل مایگریشن رو پاک کنید از اول makemigration

hramezani commented 4 months ago

سلام.

من به طور دقیق بررسی نکردم این مشکل رو. به نظرم دلیل مشکل این هست که از ‍jmodels.jDateField‍‍ در کاستوم یور مدل استفاده شده. و jmodels.jManager برای این کار مناسب نیست. چون تابع get_by_natural_key پیاده سازی نشده در داخل کلاس. در حالتی که از کاستوم یوزر مدل استفاده میکنیم، برای تغییر دادن منیجیر، کلاس مورد نظر باید از ‍BaseUserManager ارث بری کنه به نظر میرسه با تغییر مدل یوزر به کد زیر مشکل بتونه حل بشه

from django.contrib.auth.models import AbstractUser

from django_jalali.db import models as jmodels

from phonenumber_field.modelfields import PhoneNumberField
from django.contrib.auth.base_user import BaseUserManager

class CustomJUserManager(BaseUserManager, jmodels.jManager):
    pass

class CustomUser(AbstractUser):
    birth = jmodels.jDateField()
    phone_number = PhoneNumberField(blank=True, null=True)

    objects = CustomJUserManager()
amirreza8002 commented 4 months ago

سلام

بله ظاهرا باید این کار رو کرد اما با این فرق که به جای BaseUserManager باید از django.contrib.auth.models.UserManager ارث بری بشه که موقع ساخت superuser به مشکل نخوره چون متد create_superuser تو این کلاس تعریف شده