这篇博客文章解决了这个问题,非常有用。为了方便起见,我在此将其复制粘贴:
不要修改外部应用程序代码
你不应该编辑来自外部应用程序的代码。除非你先在 GitHub 上 fork 它。
那么,如何在不 fork 的情况下进行覆盖:
覆盖模板
如果你想要覆盖 templates/userena/activate_fail.html
,那么你只需要创建一个自己的 templates/userena
目录,并在其中创建你自己的 activate_fail.html
。
覆盖 URL
在使用外部应用程序时,您应该首先检查它的 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的位置,类似于:
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/
将使用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):
response = userena_views.signup(request)
return response
复刻一个应用程序
如果您不熟悉pip和virtualenv,请先阅读有关使用pip和virtualenv的帖子。
例如:
- 你以这样的方式安装了django-userena:pip install django-userena
- 首先应该卸载它:pip uninstall django-userena
- 然后转到应用程序的github页面
- 点击fork按钮
- 这将使你拥有一个具有django-userena副本的代码库
- 安装它的方法如下:pip install -e git+git@github.com:your-username/django-userena.git#egg=django-userena
- 然后,您可以在yourenv/src/django-userena中编辑代码
- 推送您的提交
感谢帖子作者!