一个新手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的存储库中结账".
解决此问题的这篇博客文章非常有帮助。为了方便起见,我在此处复制粘贴:
您无需触摸外部应用程序代码
您不应该从外部应用程序编辑代码。除非您首先在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的文章。
例如:
感谢帖子作者!
| 归档时间: |
|
| 查看次数: |
3246 次 |
| 最近记录: |