簡體   English   中英

如何擴展django oscar客戶模型領域?

[英]How do I extend the django oscar customer models fields?

如何擴展django-oscar客戶模型字段? 我已將注冊表擴展為包含更多字段,位於apps/customer/forms.py

class EmailUserCreationForm(forms.ModelForm):
    email = forms.EmailField(label=_('Email address'))
    password1 = forms.CharField(
        label=_('Password'), widget=forms.PasswordInput,
        validators=password_validators)
    password2 = forms.CharField(
        label=_('Confirm password'), widget=forms.PasswordInput)

    #### The extra fields I want to add #####

    first_name = forms.CharField(label=_('First name'))
    last_name = forms.CharField(label=_('Last name'))
    business_name = forms.CharField(label=_('Business name'))
    business_address = forms.CharField(label=_('Business address'))
    city = forms.CharField(label=_('City'))

我還在apps/customer/abstract_models.py擴展了[AbstractUser][1]的字段。

class AbstractUser(auth_models.AbstractBaseUser,
                   auth_models.PermissionsMixin):
    """
    An abstract base user suitable for use in Oscar projects.

    This is basically a copy of the core AbstractUser model but without a
    username field
    """
    email = models.EmailField(_('email address'), unique=True)
    first_name = models.CharField(
        _('First name'), max_length=255, blank=True)
    last_name = models.CharField(
        _('Last name'), max_length=255, blank=True)
    is_staff = models.BooleanField(
        _('Staff status'), default=False,
        help_text=_('Designates whether the user can log into this admin '
                    'site.'))
    is_active = models.BooleanField(
        _('Active'), default=True,
        help_text=_('Designates whether this user should be treated as '
                    'active. Unselect this instead of deleting accounts.'))
    date_joined = models.DateTimeField(_('date joined'),
                                       default=timezone.now)
    #######################################
    # Additional user fields I have added #
    #######################################
    business_name = models.CharField(
        _('Business name'), max_length=255, blank=True)
    business_address = models.CharField(
        _('Business address'), max_length=255, blank=True)
    city = models.CharField(

但是,創建用戶時,其他字段不會保存到數據庫中。 是否有更好的方法來擴展客戶模型以包含我不知道的其他字段?

當我嘗試在shell中調試時,我遇到了模型不可調用的問題:

>>> from apps.customer.abstract_models import *
>>> mg = UserManager()
>>> mg.create_user('testemail@test.com', 'testpassword', buisness_name='test_business')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "<my_working_dir>/apps/customer/abstract_models.py", line 34, in create_user
    last_login=now, date_joined=now, **extra_fields)
TypeError: 'NoneType' object is not callable

我不確定django oscar文檔中給出的指令是否可行,因為這是用於自定義方法,而不是模型上的字段。

任何幫助,將不勝感激。

編輯:

INSTALLED_APPS = INSTALLED_APPS + get_core_apps(
    ['apps.shipping',
     'apps.checkout',
     'apps.partner',
     'apps.catalogue',
     'apps.customer',
     ])


AUTH_USER_MODEL = 'customer.User'

我可以看到一些問題,解決哪些問題有望解決您的問題:

  1. 將您的AbstractUser子類移動到apps/customer/models.py ,這是Django尋找模型的地方。 你把它放在apps/customer/abstract_models.py ,這是一個存儲模型的非標准位置(Oscar只為抽象模型做這個 - 你不應該自己鏡像這個位置)。 Django不會在那里找到它們。

  2. 將您的類名更改為User而不是AbstractUser ,因為您的最終模型不是抽象的。 您還在AUTH_USER_MODEL指定customer.User - 這兩者需要匹配。

  3. 您上面發布的模型類是不完整的,所以我們無法分辨 - 但要確保它在Meta類中不包含abstract = True

  4. 運行manage.py makemigrations ,它應該為您的新用戶模型創建遷移(如果沒有,那么您的應用程序結構仍然存在問題)。 (下次運行manage.py migrate )。

  5. 不要忘記在models.py的底部導入其余的(核心)客戶模型: from oscar.apps.customer.models import * 如果沒有這些,您將失去核心客戶應用程序中的所有其他模型。

您還應該注意有關更改用戶模型的文檔中的警告(強調我的):

更改AUTH_USER_MODEL會對數據庫結構產生很大影響。 它更改了可用的表,它將影響外鍵和多對多關系的構造。 如果您打算設置AUTH_USER_MODEL,則應在創建任何遷移或首次運行manage.py migrate之前設置它。

makemigrations不支持在創建表后更改此設置,這將導致您必須手動修復架構,從舊用戶表移植數據,並可能手動重新應用某些遷移。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM