Django第三方应用程序名称冲突

22

我一直试图让两个第三方应用程序相互兼容,但由于它们的名称,这对我来说一直没有成功。

我正在尝试让这两个应用程序 django-user-accountsdjango-allauth 协同工作。问题是,这两个应用程序都使用相同的命名空间“account”,我不明白应该如何修复它们。

我找到了一些类似于 这个 的内容,它们似乎是解决问题的方法,但是当我尝试实现时,遇到了两个问题:

  1. 对于 django-user-accounts 它似乎没有起到任何作用。
  2. 对于 django-allauth,有许多位于 allauth 包下的不同应用程序,要获取其中的账户应用程序文件夹,我还必须先创建 allauth 文件夹,这使得那些其他应用程序无法访问。

这是我目前的情况。

在我的项目文件夹下,我创建了以下结构:

allauth
├── account
│   ├── apps.py
│   └── __init__.py
└── __init__.py

allauth.account.__init__中,我有:

from django.apps import AppConfig

default_app_config = 'allauth.account.apps.CustomAccountAppConfig'

allauth.account.apps中,我有:

from django.apps import AppConfig


class CustomAccountAppConfig(AppConfig):

    verbose_name = 'custom account'
    name = "allauth.account"
    label = "custom_account"

    def __init__(self, app_name, app_module):
        AppConfig.__init__(self,app_name, app_module)

这似乎解决了名称冲突的问题,但随后我收到了ImportError: No module named 'allauth.socialaccount'的错误提示,因为它覆盖了 allauth 包。

我该如何解决这个名称冲突并保持所有其他子包和应用程序正常运行?


我遇到的问题是,我可以添加所有的包,但添加包并不会导入单个文件。例如,allauth.urls 文件不可用。按照这种方式,我可能只需将整个应用程序复制到我的项目中。 - PoDuck
2
pinax-stripe 不需要 django-user-account。但是如果您只需要 social/oauth 连接,也可以使用 python-social-auth,而不是 allauth。话虽如此,如果只是一个简单的 oauth 连接,实际上不需要一个包来完成。 - Patrick Altman
嗨,我不确定,但你可以尝试在主urls.py文件中使用include方法时,为每个URL分配一个新的命名空间并检查一下。 - mh-firouzjah
1
当你遇到这种问题时,我同意迄今为止所采取的解决方案:你肯定过于依赖第三方包。话虽如此,通过快速查看django-user-account源代码,我认为之前提到的解决方案不起作用的原因很简单,他们从未定义应用程序配置。所以,与其试图覆盖他们的配置,为什么不在你的代码中尝试定义它呢? - Gero
1
我会坚持使用django-allauth而不使用其他任何东西。它具有很多定制能力。 - joshlsullivan
显示剩余8条评论
1个回答

1

解决第三方应用程序名称冲突的方法:

您可以按照以下步骤进行操作。

- 为“django-allauth”创建自定义AppConfig

您可以为“django-allauth”软件包中的“account”应用程序创建自定义AppConfig以更改其名称和标签。这将有助于避免与“django-user-accounts”软件包的冲突。以下是操作步骤:

在您的项目结构中,创建以下文件:

your_project/
├── allauth
│   ├── account
│   │   ├── apps.py
│   │   └── __init__.py
│   └── __init__.py
└── your_project/
    ├── __init__.py
    └── settings.py

在"allauth/account/apps.py"中,为"account"应用程序定义一个自定义的AppConfig:

# allauth/account/apps.py

from django.apps import AppConfig

class CustomAccountAppConfig(AppConfig):
    name = 'allauth.account'  # Set the full app name
    label = 'custom_account'  # Set a unique label for the app
    verbose_name = 'Custom Account'  # Set a human-readable name

    def ready(self):
        # Import signals and connect them here if needed
        pass

在settings.py中更新"allauth"的AppConfig:

在您的项目的"settings.py"文件中,确保使用您为"allauth"包中的"account"应用程序创建的自定义AppConfig:

# your_project/settings.py

INSTALLED_APPS = [
    # ...
    'allauth.account.apps.CustomAccountAppConfig',  # Use the custom AppConfig
    # ...
]

验证子包和应用程序:

确保“django-allauth”中的其他子包和应用程序不受此更改的影响。自定义的AppConfig只应影响“account”应用程序,而保持“allauth”的其余功能完好无损。

导入命名更改:

如果您在代码中使用“account”命名空间来访问这些包的功能,则需要更新导入以反映新的命名。例如:

# Before
from allauth.account.models import UserProfile

# After
from allauth.account.models import UserProfile

为什么选择这种方法:
这种方法应该解决了“django-user-accounts”和“django-allauth”之间的命名冲突,同时保持“django-allauth”中的其他子包和应用程序正常工作。
注意:请务必彻底测试更改,确保一切按预期运行。
希望对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接