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

django:修改/扩展第三方应用程序,django,Django,一个新手django问题 我想使用第三方应用程序,但我需要对其进行一些修改(在这种情况下,该应用程序是django注册,我需要更改一些内容,例如允许在没有确认电子邮件的情况下注册) 最初,我只是在general site packages文件夹中安装了该应用程序,并在那里更改了代码。现在,我将代码放在bitbucket上,我需要一种能够以可用方式将我的MOD保存在存储库中的方法,上传完整的python代码听起来不是一个好主意 我想最好的办法是将第三方应用程序保存在网站包中,并在我的项目中创建一个

一个新手django问题

我想使用第三方应用程序,但我需要对其进行一些修改(在这种情况下,该应用程序是django注册,我需要更改一些内容,例如允许在没有确认电子邮件的情况下注册)

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

我想最好的办法是将第三方应用程序保存在网站包中,并在我的项目中创建一个应用程序来保存我的更改。在我的例子中,我会在我的项目中创建django注册,然后在我的代码中需要它时导入它,而不是django注册

我也读过virtualenv,但我认为这主要是为了能够在同一台机器中使用多个环境(事实上,在某些地方,它建议不要更改virtualenv中安装的模块),并且不能帮助我将更改保存在存储库中

欢迎评论!
谢谢

我认为完成你想要的最简单的方法是fork-django注册,在你的应用程序中使用fork而不是原来的项目


也就是说,您可以在django注册中进行非电子邮件注册,而无需更改应用程序的代码。我通过创建一个自定义项来完成这项工作,该自定义项将用户设置为在创建时激活。你可以看到其他方法来做同样的事情。

一般来说,你应该重用并覆盖第三方应用中的行为,而不是修改它们的源

你经常会遇到的是,应用程序提供的模型可能不一定能满足你的需求,但能完成大部分工作;你会有近乎完美的形式,但需要一些小东西;只要你能改变一件事,你就会拥有完美的视角;您将拥有健全的URL,但您需要从中获得更多信息

在大多数情况下,这只需要您创建一个自定义应用程序并重新布线。提供您自己的URL,这些URL映射到您已扩展的视图,并覆盖自定义行为的方法;向其提供一个模型表单,该表单的
Meta
正在使用您从原始模型扩展而来的新模型;等等

这仅仅是你能做的事情的冰山一角,当你的创意被激发时,还有更多的方法。我可以向您介绍我是如何使用
RegistrationProfile
模型的,但我提供了自己的URL模式和一个处理注册过程的自定义基于类的视图

现在,virtualenv发挥作用的地方是,您最有可能使用它来指定和提供所需的依赖项。这时你会想说:“我已经扩展了django注册应用程序,但它不能完全适用于任何版本。它必须是X版”,或者“从提交Y的存储库中签出”

解决这个问题非常有帮助。为方便起见,我将其复制粘贴到此处:

您不触摸外部应用程序代码

您不应该编辑来自外部应用程序的代码。除非你先在github上分叉

那么,如何在不分叉的情况下重写:

覆盖模板

如果您想覆盖
templates/userena/activate\u fail.html
,那么您所要做的就是创建自己的
templates/userena
目录,并在其中创建自己的
activate\u fail.html

覆盖url

您应该首先检查外部应用程序的URL.py。正确编码的视图应该支持大量参数。例如,userena有一个带有此类签名的注册视图(在撰写本文时):

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

from userena import views as userena_views
from yourforms import YourSignupForm
然后,查找包含外部应用程序URL的链接,如:

url(r'^userena/', include('userena.urls')),
在此之前,请添加url覆盖:

url(r'^userena/signup/$', userena_views.signup, {'signup_form': YourSignupForm}, name='userena_signup'),
url(r'^userena/', include('userena.urls')),
现在,当访问者点击
/userena/signup/
时,您的自定义url定义将首先被点击。这意味着
/userena/signup/
将使用您的注册表单而不是userena的注册表单

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

  • template\u name
    :用于更改模板名称
  • extra\u context
    :用于添加将添加到 上下文
几乎每个视图都应该有这些参数

覆盖视图

覆盖视图需要覆盖要替换的视图的url。如果希望使用自己的注册视图,只需覆盖url即可:

import yourviews

# ...
url(r'^userena/signup/$', yourviews.yoursignup, name='userena_signup'),
url(r'^userena/', include('userena.urls')),
装饰视图

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

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
分叉应用程序

如果您不熟悉pip和virtualenv,请先阅读关于使用pip和virtualenv的帖子

例如:

  • 您安装了django userena,如下所示:pip install django userena
  • 首先应该卸载它:pip卸载django userena
  • 然后进入应用程序的github页面
  • 单击fork按钮
  • 这将使您成为一个具有django userena副本的存储库
  • 按如下方式安装:pip安装-e 吉特+git@github.com:您的用户名/django userena.git#egg=django userena
  • 然后可以在yourenv/src/django userena中编辑代码
  • 推动你的承诺

感谢这位作家

好的,我所做的更改正是莱昂内尔对你链接到的问题的解决方案中的更改。分叉是指(以某种方式)创建我自己的django注册分支并在那里进行更改吗?我是新来的w
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