1

我成功地扩展了一些管理模型和表单,但我不确定如何保持我的文件树干净。

如果我放在forms.py与 相同的级别admin.py,则一切正常:


表格.py

class MyUserCreationForm(UserCreationForm):
    #...

class MyUserChangeForm(UserChangeForm):
    #...

管理员.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):
    #...

管理员.py

from myapp.admin.forms import MyUserCreationForm, MyUserChangeForm

文件树

mypackage/
    admin.py
    admin/
        forms.py

我猜系统很困惑,因为 admin 既是文件又是文件夹。在 Django 中保留自定义管理相关文件的标准方法是什么?

编辑admin.py:在上面显示的情况下,文件夹之间存在冲突admin。我试图把admin.pyforms.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

网址.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)),
)
4

3 回答 3

1

首先,您需要__init__.py在管理目录中创建一个文件,以便将其视为一个包。

mypackage/
    admin/
        __init__.py 
        forms.py

__init__.py文件通常是空的。有关更多信息,请参阅有关包的 Python 文档

其次,你不能有一个名为的目录admin和一个文件admin.py。当您运行时import myapp.admin,python 将忽略该文件,并改为admin.py加载 。admin/__init__.py

一种可能的解决方案是让您迁移admin.pyadmin/__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
于 2012-12-13T13:35:01.323 回答
0

从 myapp.forms 导入 MyUserCreationForm、MyUserChangeForm

这将使用文件当前目录并从中搜索。

尝试将该行更改为:

从 admin.forms 导入 MyUserCreationForm、MyUserChangeForm

于 2012-12-13T12:57:10.663 回答
0

您可以制作一个表格文件夹并将所有表格放在那里。

于 2012-12-13T16:36:00.447 回答