Javascript Django管理弹出功能
这个话题相当常见(这里最详细的是:),但我仍然有问题。我正在尝试使用管理站点中使用的“加号”按钮功能,在这里可以向链接条目添加额外的外键。在管理站点中,将显示一个弹出窗口,允许用户提交一个新字段,然后在原始表单上填充该新值 我认为我的问题集中在这一行: 在base.html模板和popadd.html模板中。单击加号按钮不会打开新窗口。popadd模板只是加载到同一个选项卡中。提交一个新条目并不会将用户带回原始表单 管理网站是功能性的。我在settings.py文件中包括ADMIN\u MEDIA\u PREFIX='/MEDIA/ADMIN/'。它是否与RelatedObjectLookups.js所在的位置有关?它当前位于我的项目文件夹之外的管理目录中。我必须创建符号链接吗Javascript Django管理弹出功能,javascript,django,popup,admin,Javascript,Django,Popup,Admin,这个话题相当常见(这里最详细的是:),但我仍然有问题。我正在尝试使用管理站点中使用的“加号”按钮功能,在这里可以向链接条目添加额外的外键。在管理站点中,将显示一个弹出窗口,允许用户提交一个新字段,然后在原始表单上填充该新值 我认为我的问题集中在这一行: 在base.html模板和popadd.html模板中。单击加号按钮不会打开新窗口。popadd模板只是加载到同一个选项卡中。提交一个新条目并不会将用户带回原始表单 管理网站是功能性的。我在settings.py文件中包括ADMIN\u MEDI
对不起,我没有回答你的问题。如果您有任何建议(尽可能详细),我将不胜感激。我还创建了一个应用程序,您可以将其包含在您的项目中。按照下面概述的步骤,您可以重新创建Django admin的相关对象弹出功能,而无需创建任何自定义小部件、视图和URL。这些步骤假设您正试图让这个弹出窗口在您自己的自定义管理站点中工作,该站点是Django的admin的子类 让我们假设以下两个模型Book和Author,书与作者之间有一个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
admin/js/core.js
和admin/js/admin/RelatedObjectLookups.js
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%}
,以便中的逻辑返回正确的响应RelatedFieldWidgetWrapper
以我们的形式包装与相关对象字段相关联的小部件(特别是在构造函数中传递can\u add\u related=True
),告诉小部件附加必要的“+”链接,并附加相应的javascript onclick事件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
注意:我是本项目的作者您使用的浏览器是什么?您安装了哪些插件(如果有)以及它们是如何配置的?在FF中,Tab Mix Plus(以及其他)能够从根本上改变弹出窗口/新窗口的行为。我使用的是firefox。但我认为这与插件/配置无关。管理功能在管理站点中运行良好。当我试图在这个框架之外使用它时,我无法让它正常工作。答案不错,但需要更新。例如,“ADMIN\u MEDIA\u PREFIX”不推荐使用。django tekextensions如果最后有描述就好了…;]您的博客链接当前已断开。建议您始终引用正在链接的页面。如果将来链接断开,答案仍然有效。Tks,正是我所需要的!顺便说一句,您现在可以覆盖Meta类中的小部件,而不是重写整个field->FYI,field.rel自版本1.9以来一直被弃用,并被field.remote\u field取代。