Django xadmin 后台自定义action 动作

adminx.py

from xadmin import views
from .models import *
# 自定义动作所需
from django import forms, VERSION as django_version
from django.core.exceptions import PermissionDenied
from django.db import router
from django.template.response import TemplateResponse
from django.utils.encoding import force_text
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext as _
from django.contrib.admin.utils import get_deleted_objects
from xadmin.util import model_ngettext
from xadmin.views.base import filter_hook

ACTION_CHECKBOX_NAME = '_selected_action'
checkbox = forms.CheckboxInput({'class': 'action-select'}, lambda value: False)
print(checkbox)

def action_checkbox(obj):
    return checkbox.render(ACTION_CHECKBOX_NAME, force_text(obj.pk))


action_checkbox.short_description = mark_safe(
    '<input type="checkbox" id="action-toggle" />')
action_checkbox.allow_tags = True
action_checkbox.allow_export = False
action_checkbox.is_column = False

# 继承基本动作模板
from xadmin.plugins.actions import BaseActionView

class MySelectedAction(BaseActionView):

    # 这个是执行函数名
    action_name = "update_selected"
    # 这个是显示的名字
    description = "更新所選項"

    # 这里是是否启用自定义模板
    delete_confirmation_template = None
    delete_selected_confirmation_template = None

    delete_models_batch = True

    model_perm = 'delete'
    icon = 'fa fa-times'

    @filter_hook
    # 对数据的操作
    def update_models(self, queryset):
        print(self.request.POST.get('waiter_id'))
        print(self.request.POST.get('post'))
        print(type(queryset))
        print(queryset)
        n = queryset.count()
        if n:
            if self.delete_models_batch:
                self.log('update', _('Batch delete %(count)d %(items)s.') % {"count": n, "items": model_ngettext(self.opts, n)})
                queryset.update(waiter_id=self.request.POST.get('waiter_id'))
            else:
                for obj in queryset:
                    self.log('update', '', obj)
                    obj.update(waiter_id=self.request.POST.get('waiter_id'))
            self.message_user(_("Successfully deleted %(count)d %(items)s.") % {
                "count": n, "items": model_ngettext(self.opts, n)
            }, 'success')

    @filter_hook
    def do_action(self, queryset):
        # Check that the user has delete permission for the actual model
        if not self.has_delete_permission():
            raise PermissionDenied

        using = router.db_for_write(self.model)

        if django_version > (2, 0):
            setattr(self.admin_site._registry[self.model], 'has_delete_permission', self.has_delete_permission)

        # Populate deletable_objects, a data structure of all related objects that
        # will also be deleted.

        if django_version > (2, 0):
            deletable_objects, model_count, perms_needed, protected = get_deleted_objects(
                queryset, self.opts, self.admin_site)
        else:
            deletable_objects, model_count, perms_needed, protected = get_deleted_objects(
                queryset, self.opts, self.user, self.admin_site, using)

        # The user has already confirmed the deletion.
        # Do the deletion and return a None to display the change list view again.
        if self.request.POST.get('post'):
            # 这里输出yes
            # print(self.request.POST.get('post'))
            if perms_needed:
                raise PermissionDenied
            self.update_models(queryset)
            # Return None to display the change list page again.
            return None

        if len(queryset) == 1:
            objects_name = force_text(self.opts.verbose_name)
        else:
            objects_name = force_text(self.opts.verbose_name_plural)

        if perms_needed or protected:
            title = _("Cannot delete %(name)s") % {"name": objects_name}
        else:
            title = _("Are you sure?")

        import pymysql
        # 打开数据库连接
        db = pymysql.connect(host="*", user="*",
                             password="*", db="*", port=3306)

        cur = db.cursor()

        sql = "*"
        try:
            cur.execute(sql)  # 执行sql语句
            results = cur.fetchall()  # 获取查询的所有记录

        except Exception as e:
            raise e
        finally:
            db.close()  # 关闭连接

        context = self.get_context()

        # 展现到页面的内容
        print(type(results))
        print(type(queryset))
        print(results)
        print(queryset)
        context.update({
            "title": title,
            "objects_name": objects_name,
            "deletable_objects": [deletable_objects],
            'queryset': queryset,
            'results':results,
            "perms_lacking": perms_needed,
            "protected": protected,
            "opts": self.opts,
            "app_label": self.app_label,
            'action_checkbox_name': ACTION_CHECKBOX_NAME,
        })

        # Display the confirmation page
        # 确认页的相关参数
        return TemplateResponse(self.request, self.delete_selected_confirmation_template or
                                self.get_template_list('views/youji_update.html'), context)



#使用主题
class BaseSeting(object):
    enable_themes = True
    use_bootswatch = True
xadmin.site.register(views.BaseAdminView,BaseSeting)

# 设置头部底部
class GlobaleSettings(object):
    site_title = 'title'
    site_footer = 'footer'
    menu_style = 'accordion'
xadmin.site.register(views.CommAdminView,GlobaleSettings)

class TxhAdmin(object):
    # 搜索项
    search_fields = ['name','addtime']
    # 过滤项
    list_filter=['addtime']
    # 显示的列
    list_display=('name','phone','sex','is_reg','addtime','visit_type_content','waiter_id')
    actions=[MySelectedAction,]


# 注册使之显示在后台中
xadmin.site.register(white_list,TxhAdmin)
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Django Xadmin 的列表视图中添加自定义按钮,可以使用 Xadmin 的 `ButtonPlugin` 插件。 以下是添加自定义按钮的步骤: 1. 创建一个 `ButtonPlugin` 子类,例如: ```python from xadmin.plugins.utils import get_context_dict from xadmin.views import BaseAdminPlugin, ListAdminView class MyButtonPlugin(BaseAdminPlugin): # 定义按钮的图标和名称 my_btn_icon = 'fa fa-plus' my_btn_name = 'My Button' # 在页面右上角添加按钮 def get_context(self, __): context = get_context_dict(__) context['my_button_html'] = self.get_my_button_html() return context # 构建按钮的 HTML def get_my_button_html(self): return '<a class="btn btn-primary" href="#">' \ '<i class="{}"></i> {}</a>'.format(self.my_btn_icon, self.my_btn_name) ``` 2. 将 `ButtonPlugin` 子类添加到 `ListAdminView` 中: ```python class MyListAdminView(ListAdminView): # ... # 注册自定义按钮插件 plugin_my_button = MyButtonPlugin # ... ``` 3. 在模板中添加按钮的 HTML: ```html {% extends "xadmin/base_site.html" %} {% load static %} {% block content %} {{ block.super }} <div class="row-fluid"> <div class="span12"> <div class="widget-box"> <div class="widget-title"> <h5>{{ title }} List</h5> <div class="buttons"> {{ my_button_html }} <!-- 添加自定义按钮的 HTML --> </div> </div> <div class="widget-content nopadding"> <!-- ... --> </div> </div> </div> </div> {% endblock %} ``` 这样,在列表视图页面的右上角就会出现一个名为 My Button 的自定义按钮。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值