我成功扩展了一些管理模型和表单,但我不确定如何保持文件树的清洁。
如果我将forms.py
置于与admin.py
相同的水平,那么一切都会完美无缺:
forms.py
class MyUserCreationForm(UserCreationForm):
#...
class MyUserChangeForm(UserChangeForm):
#...
admin.py
from myapp.forms import MyUserCreationForm, MyUserChangeForm
文件树
mypackage/
admin.py
forms.py
现在,为了让我的管理相关表单与其他表单分离并使代码更清晰,我添加了一个文件夹admin
来放置与管理员相关的表单。在这种情况下,URL似乎搞砸了。当进入/ myapp / admin /我得到默认的管理页面,而不是我在admin.py中定制的那个。
管理员/ forms.py
class MyUserCreationForm(UserCreationForm):
#...
class MyUserChangeForm(UserChangeForm):
#...
admin.py
from myapp.admin.forms import MyUserCreationForm, MyUserChangeForm
文件树
mypackage/
admin.py
admin/
forms.py
我猜系统很混乱,因为admin既是文件也是文件夹。在Django中保留自定义管理相关文件的标准方法是什么?
编辑:在上面显示的情况下,admin.py
与文件夹admin
之间存在冲突。我尝试将admin.py
和forms.py
放在一个文件夹中,但它仍然不起作用:
管理员/ forms.py
class MyUserCreationForm(UserCreationForm):
#...
class MyUserChangeForm(UserChangeForm):
#...
管理员/ admin.py
from myapp.admin.forms import MyUserCreationForm, MyUserChangeForm
class MyUserAdmin(UserAdmin):
form = MyUserChangeForm
add_form = MyUserCreationForm
list_filter = ()
fieldsets = (
(None, {'fields': ('username', 'number', 'password')}),
(_('Personal info'), {'fields': ('first_name', 'last_name')}),
(_('Permissions'), {'fields': ('is_active', 'is_staff',)}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('username', 'number', 'password1', 'password2')}
),
)
admin.site.register(MyUser, MyUserAdmin)
文件树
mypackage/
admin/
forms.py
admin.py
urls.py
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
)
答案 0 :(得分:1)
首先,您需要在管理目录中创建一个__init__.py
文件,以便将其视为一个包。
mypackage/
admin/
__init__.py
forms.py
__init__.py
文件通常为空。有关详细信息,请参阅Python docs on packages。
其次,您不能拥有名为admin
的目录和admin.py
文件。当您运行import myapp.admin
时,python将忽略admin.py
文件,而是加载admin/__init__.py
。
一种可能的解决方案是将admin.py
移至admin/__init__.py
。然后,以下导入应该正常工作。
# in e.g. your urls.py
import myapp.admin # imports admin/__init__.py
# in e.g your admin/__init__.py:
from myapp.admin.forms import MyUserCreationForm, MyUserChangeForm # imports admin/forms.py
答案 1 :(得分:0)
来自myapp.forms的导入MyUserCreationForm,MyUserChangeForm
这将使用文件当前目录并从中搜索。
尝试将该行更改为:
来自admin.forms的导入MyUserCreationForm,MyUserChangeForm
答案 2 :(得分:0)
您可以创建一个表单文件夹并将所有表单放在那里。