在哪里放置自定义管理相关表单?

时间:2012-12-13 12:37:36

标签: python django

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

如果我将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.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

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)),
)

3 个答案:

答案 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)

您可以创建一个表单文件夹并将所有表单放在那里。