Django Oscar 的配置文件编辑表单中未显示新添加的字段?
Newly added fields not showing in Profile Edit form in Django Oscar?
我想扩展用户模型。我遵循了 this doc 中提到的步骤。我制作了一个新应用 extended_user
,其 models.py 显示为:
from django.db import models
from oscar.apps.customer.abstract_models import AbstractUser
from django.utils.translation import ugettext_lazy as _
class User(AbstractUser):
nickname = models.CharField(_("nick_name"), max_length=50, null=True, blank=True)
def get_full_name(self):
full_name = '%s %s' % (self.last_name.upper(), self.first_name)
return full_name.strip()
在settings.py我提到
AUTH_USER_MODEL = "extended_user.User"
我进行 运行 迁移。在个人资料视图中,我可以看到 nickname
字段,但在个人资料编辑视图中我看不到。我需要做什么才能在配置文件编辑表单中看到新添加的字段?
我假设您没有使用单独的角色文件 class。那样的话奥斯卡sets ProfileForm
to point to the UserForm
class.
class 反过来有一个或多或少的硬编码列表 fields
。 (实际上它说 "whichever fields exist out of this list"。)
从这里前进的最简单方法是使用您自己的 class override customer.forms.ProfileForm
,它使用您新定义的 User
模型和字段列表更适合您的用例。 (创建一个your_app.customer.forms
模块并在里面定义一个ProfileForm
。)
python3 manage.py oscar_fork_app customer
- 在您的设置中添加您的应用程序:
from oscar import get_core_apps
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'django.contrib.flatpages',
'widget_tweaks',
'YOUR_APP',
] + get_core_apps(['customer'])
- 最后放上
customer/forms.py
的这段内容:
- 它会根据您的模型更改模型以访问新添加的字段;
- 扩展现有的用户窗体以保留所有干净的数据;
- 更改
ProfileForm
var,因为 Oscar 使用它来呈现配置文件的形式以指向您的新形式。
from oscar.apps.customer.forms import UserForm as CoreUserForm
from user.models import User
from django import forms
from oscar.core.compat import existing_user_fields
class UserForm(CoreUserForm):
class Meta:
model = User
fields = existing_user_fields(['username', 'first_name', 'last_name', 'email'])
ProfileForm = UserForm
我想扩展用户模型。我遵循了 this doc 中提到的步骤。我制作了一个新应用 extended_user
,其 models.py 显示为:
from django.db import models
from oscar.apps.customer.abstract_models import AbstractUser
from django.utils.translation import ugettext_lazy as _
class User(AbstractUser):
nickname = models.CharField(_("nick_name"), max_length=50, null=True, blank=True)
def get_full_name(self):
full_name = '%s %s' % (self.last_name.upper(), self.first_name)
return full_name.strip()
在settings.py我提到
AUTH_USER_MODEL = "extended_user.User"
我进行 运行 迁移。在个人资料视图中,我可以看到 nickname
字段,但在个人资料编辑视图中我看不到。我需要做什么才能在配置文件编辑表单中看到新添加的字段?
我假设您没有使用单独的角色文件 class。那样的话奥斯卡sets ProfileForm
to point to the UserForm
class.
class 反过来有一个或多或少的硬编码列表 fields
。 (实际上它说 "whichever fields exist out of this list"。)
从这里前进的最简单方法是使用您自己的 class override customer.forms.ProfileForm
,它使用您新定义的 User
模型和字段列表更适合您的用例。 (创建一个your_app.customer.forms
模块并在里面定义一个ProfileForm
。)
python3 manage.py oscar_fork_app customer
- 在您的设置中添加您的应用程序:
from oscar import get_core_apps
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'django.contrib.flatpages',
'widget_tweaks',
'YOUR_APP',
] + get_core_apps(['customer'])
- 最后放上
customer/forms.py
的这段内容:- 它会根据您的模型更改模型以访问新添加的字段;
- 扩展现有的用户窗体以保留所有干净的数据;
- 更改
ProfileForm
var,因为 Oscar 使用它来呈现配置文件的形式以指向您的新形式。
from oscar.apps.customer.forms import UserForm as CoreUserForm
from user.models import User
from django import forms
from oscar.core.compat import existing_user_fields
class UserForm(CoreUserForm):
class Meta:
model = User
fields = existing_user_fields(['username', 'first_name', 'last_name', 'email'])
ProfileForm = UserForm