django:修改/扩展第三方应用程序

xul*_*vez 12 django

一个新手django问题

我想使用第三方应用程序,但我需要做出一些MODS的它(在这种情况下,应用程序是Django的注册,我需要改变的东西,如允许在没有确认的电子邮件注册)

最初,我只是将应用程序安装在常规site-packages文件夹中,并在那里更改了代码.现在我将我的代码放在bitbucket上,我需要一种方法能够以可用的方式将我的mod保存在存储库中,并且上传完整的python代码听起来不是一个好主意.

我想最好的方法是将第三方应用程序保留在站点包中,并在我的项目中创建一个应用程序以保留我的更改.在我的情况下,我会在我的项目中创建my-django-registration,然后在我的代码中需要它时导入它,而不是django-registration.

我还读到了virtualenv,但我认为这主要用于能够在同一台机器中使用多个环境(实际上,它建议不要更改virtualenv中安装的模块),并且不能帮助我保持我的更改在存储库中.

欢迎任何评论!谢谢

Fil*_*vić 18

通常,您应该重用并覆盖第三方应用中的行为,而不是修改其来源.

您最常遇到的是应用程序提供的模型可能不一定满足您的需求,但可以完成大部分工作; 你会有几乎完美的形式,但需要那些小东西; 如果你能改变一件事,你会有完美的观点; 你会得到理智的网址,但你需要更多的东西.

在大多数情况下,这只需要您创建自定义应用程序并重新连接所有内容.发送您自己的URL,这些URL映射到您已扩展的视图,并覆盖自定义行为的方法; 为它提供一个模型表格谁Meta正在使用你从原来扩展的新模型; 等......

这只是你能做什么的冰山一角,你的创意有更多的方法.我可以举例说明我如何使用该RegistrationProfile模型,但提供了我自己的URL模式和一个处理注册过程的基于类的自定义视图.

现在,virtualenv发挥作用的地方在于,您最有可能使用pip来指定并以需求文件格式提供所需的依赖项.那时你想说:"我已经扩展了django-registration应用程序,但它不会干净利用任何版本.它必须是版本X",或者"从提交Y的存储库中结账".

  • 在某些情况下,分叉是必要的.如果没有维护包但它不再与最新的Django兼容,那么它是不可避免的. (4认同)

dim*_*myG 5

解决此问题的这篇博客文章非常有帮助。为了方便起见,我在此处复制粘贴:

您无需触摸外部应用程序代码

您不应该从外部应用程序编辑代码。除非您首先在github上将其分叉。

因此,如何覆盖而不进行分叉:

覆盖模板

如果要覆盖templates/userena/activate_fail.html,那么您要做的就是创建自己的templates/userena目录并activate_fail.html在其中创建自己的目录。

覆盖网址

可能您应该在外部应用程序中检查的第一件事是其urls.py。正确编码的视图应支持大量参数。例如,userena具有这样的签名的注册视图(在撰写本文时):

def signup(request, signup_form=SignupForm,
       template_name='userena/signup_form.html', success_url=None,
       extra_context=None):
Run Code Online (Sandbox Code Playgroud)

这意味着您可以替换注册视图使用的表单。为此,打开您的urls.py,在顶部添加我们需要的内容:

from userena import views as userena_views
from yourforms import YourSignupForm
Run Code Online (Sandbox Code Playgroud)

然后,找到包含外部应用程序的网址,例如:

url(r'^userena/', include('userena.urls')),
Run Code Online (Sandbox Code Playgroud)

在此之前,添加您的网址替代:

url(r'^userena/signup/$', userena_views.signup, {'signup_form': YourSignupForm}, name='userena_signup'),
url(r'^userena/', include('userena.urls')),
Run Code Online (Sandbox Code Playgroud)

现在,当访问者点击时,您的自定义网址定义将是第一个被点击的/userena/signup/。这意味着/userena/signup/它将使用YourSignupForm而不是userena的注册表单。

该技巧适用于任何视图参数。您最常看到的是:

  • template_name:让您更改模板名称
  • extra_context:让您添加将添加到上下文的字典

几乎每个视图都应具有这些参数。

覆盖视图

覆盖视图需要覆盖要替换的视图的URL。如果要使用自己的注册视图,则只需覆盖URL:

import yourviews

# ...
url(r'^userena/signup/$', yourviews.yoursignup, name='userena_signup'),
url(r'^userena/', include('userena.urls')),
Run Code Online (Sandbox Code Playgroud)

装饰视图

装饰视图就像覆盖视图一样,但是会重用外部应用程序的视图。基本上,它与覆盖视图相同(请参见上文),但是您的视图将如下所示

from userena import views as userena_views

def yoursignup(request):
    # do stuff before userena signup view is called

    # call the original view
    response = userena_views.signup(request)

    # do stuff after userena signup view is done

    # return the response
    return response
Run Code Online (Sandbox Code Playgroud)

分叉应用

如果您不熟悉pip和virtualenv,请先阅读有关使用pip和virtualenv的文章。

例如:

  • 您以如下方式安装了django-userena:pip install django-userena
  • 首先,您应该将其卸载:pip卸载django-userena
  • 然后转到应用程序的github页面
  • 点击叉子按钮
  • 这将使您成为具有django-userena副本的存储库
  • 这样安装:pip install -e git+git@github.com:您的用户名/django-userena.git#egg=django-userena
  • 然后,您可以在yourenv / src / django-userena中编辑代码
  • 推动您的提交

感谢帖子作者!


Fac*_*ano 0

我认为完成您所寻找的任务的最巧妙的方法是分叉 django-registration,并在您的应用程序中使用分叉而不是原始项目。

话虽这么说,您可以在 django-registration 中进行非电子邮件注册,而无需更改应用程序的代码。我通过创建一个自定义注册后端来完成此操作,该后端将用户设置为在创建时激活。在这里您可以看到执行相同操作的其他方法。