django覆盖模块类

时间:2014-02-09 04:21:01

标签: python django

我正在使用一个模块,我需要从中扩展一个类。

#name.module.py
""" Lots of code """
class TheClassIWantToExtend(object):
   """Class implementation

"""More code"""

所以在我的django root中,我现在有了

#myCustomModule.py
class MySubclass(TheClassIWantToExtend):
  """Implementation"""

如何确保使用MySubclass而不是模块的原始类?

编辑:我应该补充说原始模块已经安装了pip install模块并且它是在virtualenv中

1 个答案:

答案 0 :(得分:1)

您可以简单地告诉django使用您的类,而不是任何需要您希望扩展的父类的特定实例的方法或类。

示例:

如果这是你的项目:

$ python django-admin.py startproject testdjango

testdjango
├── testdjango
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

你创建你的应用程序(它有自己的模型):

$ python manage.py startapp utils

testdjango
├── testdjango
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py
│
└── utils
    ├── __init__.py
    ├── admin.py
    ├── models.py
    ├── views.py
    └── urls.py

假设我们要扩展UcerCreationForm,为此您需要在utils/models.py文件中执行以下操作:

from django.contrib.auth.forms import UserCreationForm

# Since you wish to extend the `UserCreationForm` class, your class
# has to inherit from it:
class MyUserCreationForm(UserCreationForm):
    # your implemenation specific code goes here
    pass

然后,要使用此扩展类,您可以在通常使用父类的地方使用它:

# UserCreationForm is used in views, so let's say we're in the view 
# of an application `myapp`:
from utils import MyUserCreationForm
from django.shortcuts import render

# And, here you'll use it as you had done with the other in some view:
def myview(request, template_name="accounts/login.html"):
    # Perform the view logic and set variables here
    return render(request, template_name, locals())

虽然这是一个简单的例子,但要记住几件事:始终在项目设置中注册您的应用程序,并且在改进扩展时,您应该始终检查您尝试扩展的类的源代码(如发现在site-packages/django)中,否则当事情通常不起作用时,事情就会非常快地向南移动。