【问题标题】:Newly added fields not showing in Profile Edit form in Django Oscar?新添加的字段未显示在 Django Oscar 的配置文件编辑表单中?
【发布时间】:2015-08-28 09:56:17
【问题描述】:

我想扩展用户模型。我按照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 字段,但在配置文件编辑视图中我看不到。我需要做什么才能在配置文件编辑表单中看到新添加的字段?

【问题讨论】:

  • 您是在使用 Django 模型表单还是您的表单是硬编码的并声明了字段?

标签: python django django-oscar


【解决方案1】:

我假设您不使用单独的配置文件类。在这种情况下 Oscar sets ProfileForm 指向 UserForm 类。

该类又具有或多或少的硬编码列表fields。 (实际上是"whichever fields exist out of this list"。)

从这里继续前进的最简单方法是使用您自己的类,使用您新定义的 User 模型和更适合您的用例的字段列表来 override customer.forms.ProfileForm。 (创建一个your_app.customer.forms 模块并在里面定义一个ProfileForm。)

【讨论】:

  • 我在硬编码列表中添加了新字段并且它有效。但是编辑 Oscar 源代码是一种好习惯还是重写表单是一种更好的方法?
  • 在您的项目中覆盖它可以升级 Oscar 并让您在决定将代码部署到生产时不必分发自己的 Oscar 构建(默认情况下将安装 pip未经修改的 Oscar 版本并破坏您的网站)。
  • 我在 my_app/customer 中添加了一个 forms.py(其中包含 ProfileForm 类)。但是压倒一切不起作用?我必须进行的其他一些更改
  • 您还需要告诉 Oscar 您正在替换其customer 应用程序。把你的传给get_core_apps()
  • 所以客户应用我也需要分叉吗?我做到了。
【解决方案2】:
  1. python3 manage.py oscar_fork_app customer
  2. 在您的设置中添加您的应用:
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'])
  1. 最后是把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

【讨论】:

    猜你喜欢
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2021-05-04
    • 2021-04-04
    • 1970-01-01
    相关资源
    最近更新 更多