Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Django管理弹出功能_Javascript_Django_Popup_Admin - Fatal编程技术网

Javascript Django管理弹出功能

Javascript Django管理弹出功能,javascript,django,popup,admin,Javascript,Django,Popup,Admin,这个话题相当常见(这里最详细的是:),但我仍然有问题。我正在尝试使用管理站点中使用的“加号”按钮功能,在这里可以向链接条目添加额外的外键。在管理站点中,将显示一个弹出窗口,允许用户提交一个新字段,然后在原始表单上填充该新值 我认为我的问题集中在这一行: 在base.html模板和popadd.html模板中。单击加号按钮不会打开新窗口。popadd模板只是加载到同一个选项卡中。提交一个新条目并不会将用户带回原始表单 管理网站是功能性的。我在settings.py文件中包括ADMIN\u MEDI

这个话题相当常见(这里最详细的是:),但我仍然有问题。我正在尝试使用管理站点中使用的“加号”按钮功能,在这里可以向链接条目添加额外的外键。在管理站点中,将显示一个弹出窗口,允许用户提交一个新字段,然后在原始表单上填充该新值

我认为我的问题集中在这一行:

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

管理网站是功能性的。我在settings.py文件中包括ADMIN\u MEDIA\u PREFIX='/MEDIA/ADMIN/'。它是否与RelatedObjectLookups.js所在的位置有关?它当前位于我的项目文件夹之外的管理目录中。我必须创建符号链接吗


对不起,我没有回答你的问题。如果您有任何建议(尽可能详细),我将不胜感激。

我还创建了一个应用程序,您可以将其包含在您的项目中。

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

让我们假设以下两个模型BookAuthor,书与作者之间有一个FK。我们还假设我们希望能够在创建/编辑书籍时使用相关对象弹出窗口添加作者:

[app\u 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)
from django.contrib.admin.sites import AdminSite

my_admin_site = AdminSite(name='my_custom_admin')
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)
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
让我们创建自定义管理站点:

[app\u name]/sites.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)
from django.contrib.admin.sites import AdminSite

my_admin_site = AdminSite(name='my_custom_admin')
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)
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
我们的自定义管理员网站将注册两个ModelAdmins,允许用户添加/编辑/删除图书和作者模型:

[app\u name]/admin.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)
from django.contrib.admin.sites import AdminSite

my_admin_site = AdminSite(name='my_custom_admin')
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)
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
现在,我们将设置
BookForm
,它在上面的
BookModelAdmin
中使用。这就是魔法发生的地方。有关RelatedFieldWidgetWrapper api的更多信息,请参阅:

[app\u name]/forms.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)
from django.contrib.admin.sites import AdminSite

my_admin_site = AdminSite(name='my_custom_admin')
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)
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
注意事项:

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)
from django.contrib.admin.sites import AdminSite

my_admin_site = AdminSite(name='my_custom_admin')
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)
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
  • 您需要确保模板中包含这两个javascript文件:
    admin/js/core.js
    admin/js/admin/RelatedObjectLookups.js
  • Gotchas:

    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)
    
    from django.contrib.admin.sites import AdminSite
    
    my_admin_site = AdminSite(name='my_custom_admin')
    
    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)
    
    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
    
  • is\u弹出窗口
    需要在模板中正确设置和传递。具体地说,在您重写的任何自定义
    change\u form.html
    模板中,您必须记住在表单标记中的某个位置添加以下行:
    {%if is\u popup%}{%endif%}
    ,以便中的逻辑返回正确的响应
  • 发动机罩下: 本质上,我们正在使用Django admin中已经包含的表单处理逻辑、小部件包装器和javascript

  • 使用
    RelatedFieldWidgetWrapper
    以我们的形式包装与相关对象字段相关联的小部件(特别是在构造函数中传递
    can\u add\u related=True
    ),告诉小部件附加必要的“+”链接,并附加相应的javascript onclick事件
  • Django admin的javascript处理启动弹出窗口所需的所有逻辑
  • 我们的
    change\u form.html
    模板中的
    {%if is\u popup%}…{%endif%}
    逻辑和
    BaseModelAdmin.response\u add()中的逻辑处理新相关对象的保存,并返回相应的javascript响应,通知弹出窗口需要关闭
  • 相关回购:
    这个公共回购协议应该为上面讨论的Django项目提供示例代码:

    在搜索如何在具有ForeignKey关系的自定义表单中的字段旁边获得“+”图标时,Google向我指出了这个页面(就像管理员网站所做的那样),所以我想我应该添加一个“+”图标

    对我来说,使用django autocomplete light
    使用“添加另一个”功能,效果非常好。看


    另请参见。

    如果在管理中,您希望在模态中显示相关对象,而不是旧的弹出窗口,我建议您尝试使用
    django管理界面

    要安装它,请执行以下步骤:

    • pip安装django管理界面
    • 管理界面
      平面响应
      色域
      添加到
      设置中。安装的应用程序
      之前
      django.contrib.admin
    • python manage.py迁移
    • python manage.py collectstatic
    有关更多详细信息,请参阅GitHub上的


    注意:我是本项目的作者

    您使用的浏览器是什么?您安装了哪些插件(如果有)以及它们是如何配置的?在FF中,Tab Mix Plus(以及其他)能够从根本上改变弹出窗口/新窗口的行为。我使用的是firefox。但我认为这与插件/配置无关。管理功能在管理站点中运行良好。当我试图在这个框架之外使用它时,我无法让它正常工作。答案不错,但需要更新。例如,“ADMIN\u MEDIA\u PREFIX”不推荐使用。django tekextensions如果最后有描述就好了…;]您的博客链接当前已断开。建议您始终引用正在链接的页面。如果将来链接断开,答案仍然有效。Tks,正是我所需要的!顺便说一句,您现在可以覆盖Meta类中的小部件,而不是重写整个field->FYI,field.rel自版本1.9以来一直被弃用,并被field.remote\u field取代。