如何扩展django oscar客户模型领域?

时间:2016-07-07 14:03:14

标签: python django python-2.7 django-models django-oscar

如何扩展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'))

我还扩展了[AbstractUser][1]中的apps/customer/abstract_models.py字段。

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 个答案:

答案 0 :(得分:4)

我可以看到一些问题,解决哪些问题有望解决您的问题:

  1. 将您的AbstractUser子类移动到apps/customer/models.py,这是Django寻找模型的地方。你把它放在apps/customer/abstract_models.py这是一个非标准的存储模型位置(奥斯卡只为抽象模型做这个 - 你不应该自己镜像这个位置)。 Django不会在那里找到它们。

  2. 将您的班级名称更改为User而不是AbstractUser,因为您的最终模型不是抽象的。您还在customer.User中指定了AUTH_USER_MODEL - 这两者需要匹配。

  3. 您在上面发布的模型类不完整,因此我们无法说明 - 但请确保abstract = True类中的Meta不包含manage.py makemigrations

  4. 运行manage.py migrate应为您的新用户模型创建迁移(如果没有,那么您的应用结构仍然存在问题)。 (下次运行models.py)。

  5. 不要忘记导入from oscar.apps.customer.models import *UIImagePickerController *mediaUI = [[UIImagePickerController alloc] init]; mediaUI.delegate = self; [mediaUI setMediaTypes:[NSArray arrayWithObject:(NSString *)kUTTypeMovie]]; [self presentViewController:mediaUI animated:NO completion:nil]; 底部的其他(核心)客户模型。如果没有这些,您将失去核心客户应用程序中的所有其他模型。

  6. 您还应该注意documentation中有关更改用户模型的警告(强调我的):

      

    更改AUTH_USER_MODEL会对数据库结构产生很大影响。   它会更改可用的表,它会影响表   构建外键和多对多关系。如果你   打算设置AUTH_USER_MODEL,你应该在创建任何之前设置它   第一次迁移或运行manage.py迁移。

         

    不支持在创建表后更改此设置   通过makemigrations,将导致您必须手动修复您的   schema,从旧用户表中移植数据,并可能手动移植   重新申请一些迁移。