Расширенное использование администратора Django

Django

Расширенное использование администратора Django

Использование Django означает, что почти все в бэкэнд-фреймворке будет взаимодействовать с Django, за исключением ситуации, когда все функции выполняются вручную.

Фоновый администратор Django имеет большое количество атрибутов и методов с мощными функциями и возможностями настройки.Посмотрите на основные настройки и расширенное использование администратора Django через полный код и объедините форму для достижения глубокой настройки.

Простой в использовании

Если вы просто используете функцию управления данными, которая идет с админкой, вам нужно только зарегистрировать модель в админке, и вы сможете это сделать.

from django.contrib import admin

admin.site.register(News)
admin.site.register(NewsType)
admin.site.site_header = "数据库"
admin.site.index_title = "新闻后台"

Фон Django отобразит все поля соответствующей таблицы данных, нажмите по умолчаниюidперейдет на страницу модификации, соответствующуюchange_form.htmlшаблон.

Пользовательский класс администратора

Используя admin, вы также можете настроить класс администратора, чтобы настроить свойства и методы, реализованные в фоновом режиме, а затем передатьregister()для совместной регистрации пользовательских классов и моделей.

Существует два метода регистрации: один — использовать декоратор класса, другой — использоватьsite

from django.contrib import admin

# 装饰器注册
@admin.register(ModelClass)
class CustomAdmin(admin.ModelAdmin):
    list_display = '__all__'
# 使用site
class CustomAdmin(admin.ModelAdmin):
    exclude = ['id']

admin.site.register(CustomAdmin, ModelClass)

админ показывает настройки свойства

Настройки свойств в ModelAdmin

Администратор может установить ограничения для полей, отображаемых на странице списка, странице сведений, полях поиска и т. д., которые можно определить непосредственно в классе администратора.

использовать большеModelAdminНапример,ModelAdminСвойства в исходном коде:

# 在列表页显示的字段,默认会显示所有字段,有对应的方法可以重写
list_display = ('__str__',)
# 在列表页显示的字段中,可以链接到change_form页面的字段
list_display_links = ()
# 右侧的筛选,必须是字段,可以继承自SimpleListFilter来自定义筛选字段和规则,SimpleListFilter的方法在后面详细介绍
list_filter = ()
# 联表查询是否自动查询,可以是布尔,列表或元组,如果是列表或元组,则级联查询指定的字段
list_select_related = False
# 列表页每页展示的条数
list_per_page = 100
# 分页,显示全部,真是数据小于该值时才会显示全部
list_max_show_all = 200
# 在列表页可以编辑的字段
list_editable = ()
# 在列表页可以模糊搜索的字段
search_fields = ()
# 对Date和DateTime类型进行搜索
date_hierarchy = None
# 在change_form页面,按钮为,save按钮的值(save as new和save add another)
save_as = False
# 点击保存并继续编辑
save_as_continue = True
# save按钮的位置,是True则显示在页面上方
save_on_top = False
# 自定义分页类
paginator = Paginator
# 详细页面,删除、修改,更新后跳转回列表后,是否保留原搜索条件管理员现在在创建,编辑或删除对象后保留列表视图中的过滤器。
# 可以将此属性设置为False,以恢复之前清除过滤器的行为。
preserve_filters = True
# 在详情页面,如果有FK到其他表,在详情页中可以动态的填加或删除级联数据
inlines = []

Настройка действия действия в админке

Действие в админке относится к действию на странице списка.По умолчанию удаление выбранной записи.Вы можете настроить действие и зарегистрировать действие в действии.Это должен быть метод.

# 定制action中的操作
actions = []

action_form = helpers.ActionForm
# action选项显示的位置,页面上方或者页面下方
actions_on_top = True
actions_on_bottom = False
# 是否显示action选择的个数
actions_selection_counter = True
checks_class = ModelAdminChecks

Свойства в BaseModelAdmin

В дополнение к атрибутам в ModelAdmin вы также можете настроить атрибуты и методы в его родительском классе BaseModelAdmin, которые являются некоторыми общими настройками атрибутов, которые также можно выполнить в классе, наследующем дочерний BaseModelAdmin. страница подробностей.

# 自动补全,外键查询数据多时,方便查找
autocomplete_fields = ()
# 详情页,针对外键和M2M字段变成input框形式
raw_id_fields = ()
# 详情页面展示的字段
fields = None
# 详情页面排除的字段,字段可以是数据库中的也可以是自定义的
exclude = None
# 在详情页面对数据进行分隔显示,对应到admin模板中的'fieldsets.html'
fieldsets = None
# 为详情页指定form表单,可以自定义显示的数据,字段
form = forms.ModelForm
# 下面两个是M2M显示时,数据移动选择.可以参考admin中用户的权限操作
filter_vertical = ()  # 纵向展示
filter_horizontal = ()  # 横向展示
# 详情页面使用radio显示选项,FK默认使用select
radio_fields = {}
# 填加页面,在某字段输入值后,自动填加到指定字段
# prepopulated_fields = {"email": ("user",)},email字段会在用户填加user字段时自动填充
prepopulated_fields = {}
# 详情页指定显示的插件,后面详细说明
formfield_overrides = {}
# 详情页面的只读字段
readonly_fields = ()
# 详情页面排序规则
ordering = None
# 禁止某些排序,为空则禁止所有的排序
sortable_by = None
# 编辑时是否在页面上显示view on set,可以通过方法来返回一个链接,后面说明
view_on_site = True
# 列表页,模糊搜索后面显示的数据个数样式
# 为True是显示条数,为False时显示全部
show_full_result_count = True
checks_class = BaseModelAdminChecks

Пользовательский шаблон

Укажите пользовательский шаблон

В ModelAdmin есть несколько атрибутов для указания шаблонов, и вы можете самостоятельно определить HTML-файлы, чтобы назначить их странице шаблона.

# Custom templates (designed to be over-ridden in subclasses)
# 添加数据模板页
add_form_template = None
# 修改数据的模板页
change_form_template = None
# 修改多条数据的模板页
change_list_template = None
# 删除确认信息模板页
delete_confirmation_template = None
# 删除关联数据的确认页
delete_selected_confirmation_template = None
# 修改历史的模板页
object_history_template = None
# 弹出框模板页
popup_response_template = None

Переопределить встроенные шаблоны

В админке django есть шаблоны, написанные сами по себе, включая шаблоны, и каждое приложение также имеет соответствующие шаблоны.

Собственный шаблон администратора находится в проектеdjango/contrib/admin/templates/admin, под каталогом

includeпод каталогомincludeШаблон, который содержит грамматика.

change_form.htmlЭто шаблон страницы изменения данных. Если вы хотите настроить отображаемый контент на странице сведений о данных, вы можете настроить эту страницу

Все шаблоны используют синтаксис шаблона. Обратите внимание на механизм наследования синтаксиса шаблона. Элементы, перезаписанные на текущей странице, не будут отображаться напрямую.

fieldset.htlmЭто блок, объединенный со страницей сведений. Как упоминалось ранее, в пользовательском классе администратораfieldsetАтрибут, вы можете настроить страницу сведений, чтобы поля данных отображались блоками, то есть для изменения значения, передаваемого на эту страницу.

Например, используйтеifЗаявления для динамического добавления jQuery иdivтеги, добавляются только при доступе к данным из приложения

{% if app_name in request.path %}
    <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.min.js"></script>
<div>
<fieldset class="custom">

<div id="div"></div>
</fieldset>
{% endif %}

Объединить формы форм

Администратор Django объединяет форму формы, переписываетfieldset.htmlЧтобы выполнить глубокую настройку страницы сведений о данных, обработав данные, отправленные формой формы, чтобы добиться полной настройки фоновых функций.

Класс формы может быть указан в администрате Django, чтобы настроить отображаемый контент

from django import forms
# TagValueManager是自定义的类
from tag_manager import TagValueManager

class CustomAddForm(forms.ModelForm):

    """ 根据标签的id,动态生成下拉选项框 """
    for i in TagValueManager.all_tag:
        locals()[
            'field_tag_id_{}'.format(
                i['id'])] = forms.ChoiceField(
            choices=TagValueManager.get_choice(
                i['id']),
            label=i['name'])

    class Meta:
        model = CandidateTag
        fields = '__all__'
        exclude = ['tag_id', 'tag_value', 'ext_1', 'ext_2', 'candidate_id']

Примечание. Динамически сгенерированные свойства в форме должны использоватьсяfields=’__all__‘Атрибуты, которые иначе не отображаются, можно комбинироватьexcludeсвойства для управления формой, которая должна отображаться

Затем зарегистрируйте класс формы в админке

class CandidateTagAdmin(admin.ModelAdmin):
    list_display = [
        'id',
        'tag_count',
    ]
    form = CustomAddForm

Пользовательский источник страницы со списком

В дополнение к изменению свойств администратора для настройки полей, отображаемых на странице списка, вы также можете фильтровать данные страницы списка, например, чтобы отфильтровать активных пользователей и т. д. Это можно сделать вactionОпределить новые методы

Администрация также может переписатьget_querysetвозвращаемый qs — это данные после повторной проверки, что позволяет избежать некоторых ошибок в бизнес-логике.

Код здесь показывает, что на странице списка отображаются данные в других таблицах, а данные в таблице зарегистрированной модели не отображаются

    def get_queryset(self, request):
        """
        从candidate表中查询数据,在list_display中统计其标签个数
        """
        qs = Candidate.objects.all().order_by('id')
        return qs

## Обработка данных формы

После определения атрибута формы для класса администратора данные, возвращаемые на странице сведений, будут содержать данные в форме формы, а затем обрабатывать данные в сочетании с бизнес-логикой.

Например, в бизнес-сценарии принять данные формы, сохранить их в несколько других таблиц и не выполнять никаких операций над таблицей, отображающей данные, тогда ее нужно переписатьsave_modelметод, который вызывает модельsaveметод

Переопределите этот метод:

    def save_model(self, request, obj, form, change):
        """
        重写save_model方法
        """
        candidate_id = request.path.split('/')[4]
        post_dict = request.POST
        # 根据返回的form表单的标签来确定修改的tag_id
        include_field = 'field_tag_id_'
        for key, value in post_dict.items():
            if include_field in key:
                tag_id = key.split('_')[-1]
                tag_value = value
                try:
                    obj, created = CandidateTag.objects.update_or_create(
                        defaults={'tag_value': tag_value}, candidate_id=candidate_id, tag_id=tag_id)
                except Exception as e:
                    tag_name = TagValueManager.all_tag.get(id=tag_id)['name']
                    messages.add_message(request, messages.ERROR, '求职者的"{}"标签信息保存失败'.format(tag_name))

расширять

существуетget_querysetВ методе отображаются статистические данные в модели класса.Эти статистические данные не генерируются в базе данных.Это метод, определенный в классе модели.Возвращаемое значение этого метода может отображаться непосредственно на странице списка. Например, количество тегов, упомянутых выше

В то же время вы также можете вернуть тег HTML.Когда вы получаете это поле в синтаксисе шаблона, вы получаете тег HTML, который отображается напрямую.

from django.utils.safestring import mark_safe
# 使用mark_safe
@mark_safe
def get_user_dept(self,obj):
    """ 这个方法在模型中 """
    return "<p>this is a HTML tag</p>"
# 允许HTML标签
get_report_depts.allow_tags = True
# HTML展示时的字段名
get_report_depts.short_description = '所属部门'