Django Admin弹出功能

Ed.*_*Ed. 9 javascript django admin popup

这个话题相当常见(这里最明确的详细说明:http://www.hoboes.com/Mimsy/hacks/replicating-djangos-admin/),但我仍然遇到问题.我正在尝试使用管理站点中使用的"加号"按钮功能,可以在链接条目中添加其他外键.在管理站点中,会显示一个弹出窗口,允许用户提交新字段,然后在原始表单上填充该新值.

我认为我的问题围绕着这一行:

在base.html模板和popadd.html模板中.单击加号按钮不会显示新窗口.popadd模板只需加载到同一个选项卡中.并且提交新条目不会将用户带回原始表单.

管理站点功能正常.我在settings.py文件中包含ADMIN_MEDIA_PREFIX ='/ media/admin /'.它与RelatedObjectLookups.js所在的位置有关吗?它目前位于我的项目文件夹之外的管理目录中.我是否必须创建符号链接?

抱歉没有问题.将不胜感激任何建议(尽可能详细).

coo*_*ean 7

按照下面列出的步骤,您可以重新创建Django管理员的相关对象弹出功能,而无需创建任何自定义小部件,视图和URL.这些步骤假设您试图让这个弹出窗口在您自己的自定义管理站点中工作,该站点是Django管理员的子类.

让我们假设以下两个模型BookAuthor,以及从Book到Author的FK.让我们假设我们希望能够在创建/编辑图书时使用相关对象弹出窗口添加作者:

[APP_NAME] /models.py:

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=200)

class Book(models.Model):
    author = models.ForeignKey(Author)
    title = models.CharField(max_length=200)
Run Code Online (Sandbox Code Playgroud)

让我们创建我们的自定义管理站点:

[APP_NAME] /sites.py:

from django.contrib.admin.sites import AdminSite

my_admin_site = AdminSite(name='my_custom_admin')
Run Code Online (Sandbox Code Playgroud)

我们的自定义管理站点将注册两个ModelAdmins,以允许用户添加/编辑/删除Book和Author模型:

[APP_NAME] /admin.py:

from django.contrib.admin.options import ModelAdmin

from [app_name].forms import BookForm # We'll create this form below
from [app_name].models import Author, Book
from [app_name].sites import my_admin_site

class BookModelAdmin(ModelAdmin):
    form = BookForm()

# Register both models to our custom admin site
my_admin_site.register(Author, ModelAdmin)
my_admin_site.register(Book, BookModelAdmin)
Run Code Online (Sandbox Code Playgroud)

现在,我们将设置上面BookForm使用的内容BookModelAdmin.这就是魔术发生的地方.有关RelatedFieldWidgetWrapper api的更多信息,请单击此处:

[APP_NAME] /forms.py:

from django.contrib.admin.widgets import RelatedFieldWidgetWrapper
from django import forms

from [app_name].models import Book
from [app_name].sites import my_admin_site

class BookForm(forms.ModelForm):
    author = Book._meta.get_field('author').formfield(
        widget=RelatedFieldWidgetWrapper(
            Book._meta.get_field('author').formfield().widget,
            Book._meta.get_field('author').rel,
            my_admin_site,
            can_add_related=True
        )
    )

    class Meta:
        model = Book
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 您需要确保模板中包含这两个javascript文件:admin/js/core.jsadmin/js/admin/RelatedObjectLookups.js.

陷阱:

  1. is_popup需要在模板中正确设置和传递.具体来说,在change_form.html您覆盖的任何自定义模板中,您必须记住在表单标记中的某处添加此行:{% if is_popup %}<input type="hidden" name="_popup" value="1" />{% endif %},以便逻辑BaseModelAdmin.response_add()返回正确的响应.

Under The Hood: 基本上,我们正在重新使用Django管理员已经包含的表单处理逻辑,小部件包装器和javascript.

  1. 使用RelatedFieldWidgetWrapper包裹在我们的形式相关联的相关对象字段的微件(和具体地通过can_add_related=True在构造)告诉插件追加与连接到它的相应的javascript onclick事件必要的"+"链接.
  2. Django admin的javascript处理启动弹出窗口所需的所有逻辑.
  3. {% if is_popup %}...{% endif %}我们的逻辑change_form.html模板(S)和逻辑BaseModelAdmin.response_add()处理的新的相关对象的保存并返回通知弹出,它需要关闭相应的JavaScript的响应.

相关回购: 这个公共回购应该提供上面讨论的Django项目的示例代码:https://github.com/cooncesean/Books


son*_*tek 5

我还在http://github.com/sontek/django-tekextensions创建了一个可以包含在项目中的应用程序

  • 始终建议您从链接的页面引用.如果将来链接中断,答案仍然有效. (3认同)
  • 您的博客链接目前已损坏 (2认同)

Sae*_*aeX 5

Google在搜索如何在具有ForeignKey关系的自定义表单中的字段旁边获取“ +”图标(就像管理站点那样)时将我指向该页面,所以我想添加一下。

对我来说,使用django-autocomplete-light“添加另一个”功能可以很好地完成技巧。观看此现场演示

请参阅Django ModelChoiceField也没有加号按钮