【问题标题】:Where to put custom admin-related forms?将自定义管理相关表单放在哪里?
【发布时间】:2012-12-13 12:37:36
【问题描述】:

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

如果我将forms.pyadmin.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 中自定义的页面。

admin/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放到一个文件夹里,还是不行:

admin/forms.py

class MyUserCreationForm(UserCreationForm):
    #...

class MyUserChangeForm(UserChangeForm):
    #...

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

【问题讨论】:

  • 您是否收到错误消息?如果有,是什么?
  • 网址看起来很乱。转到<myurl>/myapp/admin/ 时,我得到的是默认管理页面,而不是我在admin.py 中自定义的页面。

标签: python django


【解决方案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

【讨论】:

  • 我已经有了 init.py 文件。我将我的 admin.py 移动到 admin/,更改了导入路径,但我仍然遇到同样的问题。
  • 当您说您更改了导入路径时,不清楚您做了什么,所以我用您应该使用的导入更新了我的答案。确保您已重新启动 Django 服务器并删除了所有 pyc 文件。
  • 我将admin.pyforms.py 放入myapp/admin/。在admin.py 中,我使用from myapp.admin.forms import MyUserCreationForm, MyUserChangeForm 导入我的表单,而我的urls.py 是默认表单(我编辑了我的问题以添加它)。这样做,我仍然无法在 myurl/admin/ 中看到我的模型管理员
  • 尝试将打印语句添加到您的__init__forms.py 模块以确保它们正在被导入。您尚未显示用于注册自定义模型管理员的代码,因此我无法判断这是否正确。
  • 我编辑了我的问题,以展示我如何将所有内容放在 admin 文件夹中。
【解决方案2】:

从 myapp.forms 导入 MyUserCreationForm、MyUserChangeForm

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

尝试将该行更改为:

从 admin.forms 导入 MyUserCreationForm、MyUserChangeForm

【讨论】:

    【解决方案3】:

    你可以制作一个表格文件夹,把所有表格都放在那里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      相关资源
      最近更新 更多