أنا أستخدم https://github.com/tmm/django-username-email الذي يستخدم البريد الإلكتروني بدلاً من وجود اسم مستخدم منفصل ، وهذا يعمل بشكل جيد بشكل عام ولكنه يكسر admin_user fixture لأن هذا:
if username_field != 'username':
extra_fields[username_field] = 'admin'
يؤدي إلى هذا
user = UserModel._default_manager.create_superuser(
'admin', '[email protected]', 'password', **extra_fields)
رفع هذا
TypeError: create_superuser() got multiple values for argument 'email'
لدي نفس المشكلة.
لم تجد حلا لهذا؟
لقد تجاوزت admin_user fixture في conftest.py ، فأنت تعلن فقط عن وظيفة هناك بالاسم نفسه. منجم يشبه:
@pytest.fixture()
def admin_user(db, django_user_model, django_username_field):
"""A Django admin user.
This uses an existing user with username 'admin', or creates a new one with
password 'password'.
"""
UserModel = django_user_model
username_field = django_username_field
try:
user = UserModel._default_manager.get(**{username_field: '[email protected]'})
except UserModel.DoesNotExist:
extra_fields = {}
user = UserModel._default_manager.create_superuser(
'[email protected]', 'password', **extra_fields)
return user
نعم ، لقد قمت أيضًا بالكتابة فوقه. من السهل القيام به. يبدو أن مؤلفي pytest-django بذلوا جهدًا لجعله يعمل في الحالة التي يكون فيها اسم المستخدم = البريد الإلكتروني ، ولكن في الممارسة العملية ، هذا لا يعمل.
تم تغيير الكود في هذا الصدد: https://github.com/blueyed/pytest-django/blob/33617687f185fecf04bf4bdd99017289078f52df/pytest_django/fixture.py#L261 -L262
عبر https://github.com/pytest-dev/pytest-django/commit/a3dc56d895b73738ff81b08c87ea68a0394984e0
لذا أفترض أن هذا (أو على الأقل المشكلة الأصلية) قد تم إصلاحه؟
في حالتي ، كان لدي بالفعل طريقة UserModel._default_manager.create_superuser
معدلة لا تستخدم وسيطة اسم المستخدم. هذا ما تميل إلى فعله إذا كان لديك UserModel مخصص لا يحتوي على حقل اسم مستخدم (ولكن حقل بريد إلكتروني).
لذا ، فإن تغيير الكود الخاص بك أفضل بالفعل ، لكنه لا يغطي الحالة عندما لا يكون لديك حقل اسم مستخدم. وهو أمر محل نقاش على أي حال ، لأنه لا يمكنك تغطية جميع الحالات المخصصة بالطبع. شكرا للمتابعة.
التعليق الأكثر فائدة
في حالتي ، كان لدي بالفعل طريقة
UserModel._default_manager.create_superuser
معدلة لا تستخدم وسيطة اسم المستخدم. هذا ما تميل إلى فعله إذا كان لديك UserModel مخصص لا يحتوي على حقل اسم مستخدم (ولكن حقل بريد إلكتروني).لذا ، فإن تغيير الكود الخاص بك أفضل بالفعل ، لكنه لا يغطي الحالة عندما لا يكون لديك حقل اسم مستخدم. وهو أمر محل نقاش على أي حال ، لأنه لا يمكنك تغطية جميع الحالات المخصصة بالطبع. شكرا للمتابعة.