簡體   English   中英

Django 管理彈出功能

[英]Django Admin popup functionality

這個話題很常見(最明確地在這里詳細說明: http : //www.hoboes.com/Mimsy/hacks/replicating-djangos-admin/ ),但我仍然遇到問題。 我正在嘗試使用管理站點中使用的“加號”按鈕功能,可以在其中向鏈接條目添加額外的外鍵。 在管理站點中,會顯示一個彈出窗口,允許用戶提交新字段,然后將新值填充到原始表單中。

我認為我的問題集中在包含這一行:

在 base.html 模板和 popadd.html 模板中。 單擊加號按鈕不會打開新窗口。 popadd 模板只是在同一個選項卡中加載。 並且提交新條目不會將用戶帶回原始表單。

管理站點正常運行。 我在 settings.py 文件中包含 ADMIN_MEDIA_PREFIX = '/media/admin/' 。 它與RelatedObjectLookups.js 所在的位置有關嗎? 它目前位於我的項目文件夾之外的 admin 目錄中。 我必須創建符號鏈接嗎?

對不起,菜鳥問題。 將不勝感激任何建議(盡可能詳細)。

遵循下面概述的步驟將允許您重新創建 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)

讓我們創建我們的自定義管理站點:

[app_name]/sites.py:

from django.contrib.admin.sites import AdminSite

my_admin_site = AdminSite(name='my_custom_admin')

我們的自定義管理站點將注冊兩個 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)

現在,我們將設置在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

筆記:

  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 admin 中的表單處理邏輯、小部件包裝器和 javascript。

  1. 使用RelatedFieldWidgetWrapper在我們的表單中包裝與相關對象字段關聯的小部件(特別是在構造函數中傳遞can_add_related=True )告訴小部件附加必要的“+”鏈接,並附加適當的 javascript onclick 事件。
  2. Django admin 的 javascript 處理啟動彈出窗口所需的所有邏輯。
  3. 我們change_form.html模板中的{% if is_popup %}...{% endif %}邏輯和BaseModelAdmin.response_add()的邏輯處理新相關對象的保存並返回適當的 javascript 響應,通知需要關閉的彈出窗口。

相關倉庫:這個公共倉庫應該為上面討論的 Django 項目提供示例代碼: https : //github.com/cooncesean/Books

在搜索如何在具有外鍵關系的自定義表單中的字段旁邊獲得“+”圖標時,Google 將我指向此頁面(就像管理站點一樣),所以我想我會添加。

對我來說,使用django-autocomplete-light使用“添加另一個”功能很好地解決了這個問題。 請參閱此現場演示

請參閱Django ModelChoiceField 也沒有加號按鈕

我還創建了一個應用程序,您可以在http://github.com/sontek/django-tekextensions 上將其包含在您的項目中

如果在管理員中您想以模式顯示相關對象而不是舊的彈出窗口,我建議您嘗試django-admin-interface

要安裝它,請按照下列步驟操作:

  • pip install django-admin-interface
  • django.contrib.admin之前admin_interfaceflat_responsivecolorfield添加到settings.INSTALLED_APPS
  • python manage.py migrate
  • python manage.py collectstatic

有關更多詳細信息,請參閱 GitHub 上的django-admin-interface

注意:我是這個項目的作者

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM