This blog post 解决了这个问题非常有帮助。为方便起见,我在这里复制粘贴:
您无需接触外部应用代码
您不应该从外部应用程序编辑代码。除非你先在 github 上 fork 。
那么,如何在不分叉的情况下覆盖:
覆盖模板
如果您想覆盖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):
这意味着您可以替换注册视图使用的表单。为此,请打开您的 urls.py,在顶部添加我们需要的内容:
from userena import views as userena_views
from yourforms import YourSignupForm
然后,找到包含外部应用程序的网址,例如:
url(r'^userena/', include('userena.urls')),
在此之前,添加您的网址覆盖:
url(r'^userena/signup/$', userena_views.signup, {'signup_form': YourSignupForm}, name='userena_signup'),
url(r'^userena/', include('userena.urls')),
现在,当访问者点击 /userena/signup/ 时,您的自定义 url 定义将首先被点击。这意味着/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')),
装饰视图
装饰视图类似于覆盖视图,但会重用外部应用的视图。基本上,它与覆盖视图相同(见上文),但您的视图看起来像这样
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 uninstall django-userena
- 然后进入应用的 github 页面
- 点击分叉按钮
- 这将使您成为一个包含 django-userena 副本的存储库
- 这样安装:pip install -e
git+git@github.com:your-username/django-userena.git#egg=django-userena
- 然后就可以编辑yourenv/src/django-userena中的代码了
- 推送您的提交
致作者的功劳!