django admin site search
1.1.0
نموذج بحث عالمي/موقع لمشرف Django.
model_char_fields
( افتراضي ): جميع قيم CharField
(والفئة الفرعية)، مع __icontains
.admin_search_fields
: استدعاء طريقة get_search_results(...) الخاصة بـ ModelAdmin.pip install django-admin-site-search
.admin_site_search
إلى إعداد INSTALLED_APPS
الخاص بك.AdminSiteSearchView
إلى AdminSite الخاص بك: from django . contrib import admin
from admin_site_search . views import AdminSiteSearchView
class MyAdminSite ( AdminSiteSearchView , admin . AdminSite ):
...
admin/base_site.html
في دليل templates/
الخاص بك.templates/
الدليل الخاص بك موجودًا داخل أحد التطبيقات، فيجب أن يظهر هذا التطبيق في INSTALLED_APPS
قبل تطبيق المسؤول المخصص.admin_site_search
: {% extends "admin/base_site.html" %}
{% block extrahead %}
{% include 'admin_site_search/head.html' %}
{{ block.super }}
{% endblock %}
{% block footer %}
{{ block.super }}
{% include 'admin_site_search/modal.html' %}
{% endblock %}
{% block usertools %}
{% include 'admin_site_search/button.html' %}
{{ block.super }}
{% endblock %}
admin_site_search/head.html
بتحميل Alpine JS./static/
لتجنب التبعيات الخارجية.modal.html
و button.html
ليسا صارمين، على الرغم من أن الأول من الأفضل أن يكون في موضع المستوى الأعلى.{% block header %}
- وهذا أفضل من footer
. class MyAdminSite ( AdminSiteSearchView , admin . AdminSite ):
# Sets the last part of the search route (`<admin_path>/search/`).
site_search_path : str = "search/"
# Set the search method/behaviour.
site_search_method : Literal [ "model_char_fields" , "admin_search_fields" ] = "model_char_fields"
def match_app (
self , request , query : str , name : str
) -> bool :
"""DEFAULT: case-insensitive match the app name"""
def match_model (
self , request , query : str , name : str , object_name : str , fields : List [ Field ]
) -> bool :
"""DEFAULT: case-insensitive match the model and field attributes"""
def match_objects (
self , request , query : str , model_class : Model , model_fields : List [ Field ]
) -> QuerySet :
"""DEFAULT: Returns the QuerySet after performing an OR filter across all Char fields in the model."""
def filter_field (
self , request , query : str , field : Field
) -> Optional [ Q ]:
"""DEFAULT: Returns a Q 'icontains' filter for Char fields, otherwise None
Note: this method is only invoked if model_char_fields is the site_search_method."""
def get_model_queryset (
self , request , model_class : Model , model_admin : Optional [ ModelAdmin ]
) -> QuerySet :
"""DEFAULT: Returns the model class' .objects.all() queryset."""
def get_model_class (
self , request , app_label : str , model_dict : dict
) -> Optional [ Model ]:
"""DEFAULT: Retrieve the model class from the dict created by admin.AdminSite"""
أضف نتائج TextField
للبحث.
from django . contrib import admin
from django . db . models import Q , Field , TextField
from admin_site_search . views import AdminSiteSearchView
class MyAdminSite ( AdminSiteSearchView , admin . AdminSite ):
site_search_method : "model_char_fields"
def filter_field ( self , request , query : str , field : Field ) -> Optional [ Q ]:
"""Extends super() to add TextField support to site search"""
if isinstance ( field , TextField ):
return Q ( ** { f" { field . name } __icontains" : query })
return super (). filter_field ( query , field )
لاحظ أن هذا لا يتم بشكل افتراضي لأسباب تتعلق بالأداء: __icontains
على عدد كبير من إدخالات النص هو دون المستوى الأمثل.