Tui*_*noe 4 python django django-models python-2.7 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'))
Run Code Online (Sandbox Code Playgroud)
我还延长了[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(
Run Code Online (Sandbox Code Playgroud)
但是,当创建用户时,附加字段不会保存到数据库中。是否有更好的方法来扩展客户模型以包含我不知道的其他字段?
当我尝试在 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
Run Code Online (Sandbox Code Playgroud)
我不确定django oscar文档中给出的说明是否有效,因为这是用于自定义方法,而不是模型上的字段。
任何帮助,将不胜感激。
编辑:
INSTALLED_APPS = INSTALLED_APPS + get_core_apps(
['apps.shipping',
'apps.checkout',
'apps.partner',
'apps.catalogue',
'apps.customer',
])
AUTH_USER_MODEL = 'customer.User'
Run Code Online (Sandbox Code Playgroud)
我可以看到一些问题,解决这些问题有望解决您的问题:
将您的子类移动AbstractUser到apps/customer/models.py其中 Django 查找模型的位置。您已将其放在apps/customer/abstract_models.py用于存储模型的非标准位置(奥斯卡仅对抽象模型执行此操作 - 您不应该自己镜像此位置)。Django 不会在那里找到它们。
将您的类名更改为User而不是AbstractUser,因为您的最终模型不是抽象的。您还在customer.User您的AUTH_USER_MODEL- 这两个需要匹配中指定。
您在上面发布的模型类不完整,所以我们无法判断 - 但请确保它不包含abstract = True在Meta类中。
运行manage.py makemigrationswhich 应该为您的新用户模型创建迁移(如果没有,那么您的应用程序结构仍然存在问题)。(下一次运行manage.py migrate)。
不要忘记在models.py:底部导入其余的(核心)客户模型from oscar.apps.customer.models import *。如果没有这些,您将失去核心客户应用程序中的所有其他模型。
您还应该注意文档中关于更改用户模型的警告(重点是我的):
更改 AUTH_USER_MODEL 对您的数据库结构有很大影响。它会更改可用的表,并且会影响外键和多对多关系的构建。如果您打算设置 AUTH_USER_MODEL,您应该在创建任何迁移或第一次运行 manage.py migrate 之前设置它。
makemigrations 不支持在创建表后更改此设置,这将导致您必须手动修复架构、从旧用户表移植数据,并可能手动重新应用某些迁移。
| 归档时间: |
|
| 查看次数: |
1414 次 |
| 最近记录: |