日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

strak组件(9):关键字搜索

發布時間:2023/12/31 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 strak组件(9):关键字搜索 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

效果圖:

?

在列表視圖函數增加搜索功能、

新增函數

def get_search_list(self) 鉤子方法,獲取搜索條件

一、strak組件

strak/service/core_func.py

import functools from types import FunctionTypefrom django import forms from django.db.models import Q from django.http import QueryDict from django.urls import re_path from django.utils.safestring import mark_safe from django.shortcuts import HttpResponse, render, reverse, redirectfrom stark.utils.pagination import Paginationclass StarkModelForm(forms.ModelForm):def __init__(self, *args, **kwargs):super(StarkModelForm, self).__init__(*args, **kwargs)# 統一給ModelForm生成字段添加樣式for name, field in self.fields.items():field.widget.attrs['class'] = 'form-control'def get_choice_text(title, field):"""對于Stark組件中定義列時,choice如果想要顯示中文信息,調用此方法即可。:param title: 希望頁面顯示的表頭:param field: 字段名稱:return:"""def inner(self, obj=None, is_header=None):if is_header:return titlemethod = "get_%s_display" % fieldreturn getattr(obj, method)()# GENDER_CHOICES = ((MALE, '男'),(FEMALE, '女'),)# 對于choice字段,如果想獲取獲取第二個值,可以通過:對象.get_字段名_display()return innerclass StarkHandler(object):list_display = []order_list = []search_list = []per_page_data = 10has_add_btn = Truemodel_form_class = Nonelist_template = Noneadd_template = Noneedit_template = Nonedelete_template = Nonedef __init__(self, site, model_class, prev):self.site = siteself.model_class = model_classself.prev = prevself.request = Nonedef display_edit(self, obj=None, is_header=None):"""自定義頁面顯示的列(表頭和內容):param obj::param is_header::return:"""if is_header:return '編輯'name = '%s:%s' % (self.site.namespace, self.get_edit_url_name,)return mark_safe('<a href="%s">編輯</a>' % reverse(name, args=(obj.pk,)))def display_delete(self, obj=None, is_header=None):if is_header:return '刪除'name = '%s:%s' % (self.site.namespace, self.get_delete_url_name,)return mark_safe('<a href="%s">刪除</a>' % reverse(name, args=(obj.pk,)))def get_list_display(self):"""獲取頁面上應該顯示的列,預留的自定義擴展,例如:以后根據用戶的不同顯示不同的列:return:"""value = []value.extend(self.list_display)return valuedef get_search_list(self):return self.search_listdef get_add_btn(self, *args, **kwargs):if self.has_add_btn:return '<a class="btn btn-primary" href="%s">添加</a>' % self.reverse_add_url(*args, **kwargs)def get_model_form_class(self, request, *args, **kwargs):if self.model_form_class:return self.model_form_classclass DynamicModelForm(StarkModelForm):class Meta:model = self.model_classfields = '__all__'return DynamicModelFormdef get_order_list(self):return self.order_list or ['-id', ]def list_view(self, request, *args, **kwargs):"""列表頁面:param request::return:"""# 搜索列表寫ORM語句,如:['name__contains','email__contains','id__gt','gender']search_list = self.get_search_list()search_value = request.GET.get('q', '')conn = Q()conn.connector = 'OR' # 通過or鏈接if search_value:for item in search_list:conn.children.append((item, search_value)) # conn.children.append('name__contains','張三')# 1.獲取排序order_list = self.get_order_list()queryset = self.model_class.objects.filter(conn).order_by(*order_list)# 2.分頁處理all_count = queryset.count()query_params = request.GET.copy() # 深copyquery_params._mutable = True # query_params默認不可修改 pager = Pagination(current_page=request.GET.get('page'),all_count=all_count,base_url=request.path_info,query_params=query_params,per_page_data=self.per_page_data,)data_list = queryset[pager.start:pager.end]# 3 處理表格list_display = self.get_list_display() # 會優先調用UserInfoHandler里的get_list_display()方法。# 3.1 處理表格的表頭header_list = []if list_display:for field_or_func in list_display:if isinstance(field_or_func, FunctionType):verbose_name = field_or_func(self, obj=None, is_header=True)else:verbose_name = self.model_class._meta.get_field(field_or_func).verbose_nameheader_list.append(verbose_name)else:header_list.append(self.model_class._meta.model_name) # 如果用戶沒有填寫list_display,就顯示表名# 3.2 處理表的內容body_list = []for obj in data_list:tr_list = []if list_display:for field_or_func in list_display:if isinstance(field_or_func, FunctionType):tr_list.append(field_or_func(self, obj, is_header=False, *args, **kwargs))else:tr_list.append(getattr(obj, field_or_func))else:tr_list.append(obj) # 如果用戶沒有填寫list_display,就顯示表對象,所以表類要定義__str__方法 body_list.append(tr_list)# 4 添加按鈕add_btn = self.get_add_btn(*args, **kwargs)context = {'data_list': data_list,'header_list': header_list,'body_list': body_list,'pager': pager,'add_btn': add_btn,'search_list': search_list,'search_value': search_value,}return render(request, self.list_template or 'stark/data_list.html', context)def save(self, form, is_update=False, *args, **kwargs):"""在使用ModelForm保存數據之前預留的鉤子方法:param form::param is_update::return:"""form.save()def add_view(self, request, *args, **kwargs):"""添加頁面:param request::return:"""model_form_class = self.get_model_form_class(request, *args, **kwargs)if request.method == 'GET':form = model_form_class()return render(request, 'stark/change.html', {'form': form})form = model_form_class(data=request.POST)if form.is_valid():self.save(form, False, *args, **kwargs)# 在數據庫保存成功后,跳轉回列表頁面(攜帶原來的參數)。return redirect(self.reverse_list_url(*args, **kwargs))return render(request, self.add_template or 'stark/change.html', {'form': form})def edit_view(self, request, pk, *args, **kwargs):"""編輯頁面:param request::return:"""current_edit_object = self.model_class.objects.filter(pk=pk).first()if not current_edit_object:return HttpResponse('要修改的數據不存在,請重新選擇')model_form_class = self.get_model_form_class(request, *args, **kwargs)if request.method == 'GET':form = model_form_class(instance=current_edit_object)return render(request, 'stark/change.html', {'form': form})form = self.model_form_class(data=request.POST, instance=current_edit_object)if form.is_valid:self.save(form, True, *args, **kwargs)# 在數據庫保存成功后,跳轉回列表頁面(攜帶原來的參數)return redirect(self.reverse_list_url(*args, **kwargs))return render(request, 'stark/change.html', {'form': form})def delete_view(self, request, pk, *args, **kwargs):"""刪除頁面:param request::param pk::return:"""original_list_url = self.reverse_list_url(*args, **kwargs)if request.method == 'GET':return render(request, 'stark/delete.html', {'cancel': original_list_url})self.model_class.objects.filter(pk=pk).delete()return redirect(original_list_url)def get_url_name(self, params):app_label, model_name = self.model_class._meta.app_label, self.model_class._meta.model_nameif self.prev:return '%s_%s_%s_%s' % (app_label, model_name, self.prev, params)return '%s_%s_%s' % (app_label, model_name, params)@propertydef get_list_url_name(self):"""獲取列表頁面URL的name:return:"""return self.get_url_name('list')@propertydef get_add_url_name(self):"""獲取添加頁面URL的name:return:"""return self.get_url_name('add')@propertydef get_edit_url_name(self):"""獲取編輯頁面URL的name:return:"""return self.get_url_name('edit')@propertydef get_delete_url_name(self):"""獲取刪除頁面URL的name:return:"""return self.get_url_name('delete')def reverse_common_url(self, name, *args, **kwargs):"""生成帶有原搜索條件的URL:param name: url:param args::param kwargs::return:"""name = '%s:%s' % (self.site.namespace, name)base_url = reverse(name, args=args, kwargs=kwargs)if not self.request.GET:reverse_url = base_urlelse:params = self.request.GET.urlencode()new_query_dict = QueryDict(mutable=True)new_query_dict['_filter'] = paramsreverse_url = '%s?%s' % (base_url, new_query_dict.urlencode())return reverse_urldef reverse_add_url(self, *args, **kwargs):"""帶有原搜索條件的增加URL:param args::param kwargs::return:"""return self.reverse_common_url(self.get_add_url_name, *args, **kwargs)def reverse_edit_url(self, *args, **kwargs):"""帶有原搜索條件的編輯URL:param args::param kwargs::return:"""return self.reverse_common_url(self.get_edit_url_name, *args, **kwargs)def reverse_delete_url(self, *args, **kwargs):"""帶有原搜索條件的刪除URL:param args::param kwargs::return:"""return self.reverse_common_url(self.get_delete_url_name, *args, **kwargs)def reverse_list_url(self, *args, **kwargs):name = '%s:%s' % (self.site.namespace, self.get_list_url_name,)base_url = reverse(name, args=args, kwargs=kwargs)params = self.request.GET.get('_filter')if not params:return base_urlreturn '%s?%s' % (base_url, params)def wrapper(self, func):"""當每一個request請求進來的時候,把request賦值給類的數據屬性self.request:param func: request請求對應的視圖函數:return:"""@functools.wraps(func) # 保留原函數的原信息,寫裝飾器建議寫上這個。def inner(request, *args, **kwargs):self.request = requestreturn func(request, *args, **kwargs)return innerdef get_urls(self):patterns = [re_path(r'^list/$', self.wrapper(self.list_view), name=self.get_list_url_name),re_path(r'^add/$', self.wrapper(self.add_view), name=self.get_add_url_name),re_path(r'^edit/(\d+)/$', self.wrapper(self.edit_view), name=self.get_edit_url_name),re_path(r'^delete/(\d+)/$', self.wrapper(self.delete_view), name=self.get_delete_url_name),]patterns.extend(self.extra_urls())return patternsdef extra_urls(self):return []class StarkSite(object):def __init__(self):self._registry = []self.app_name = 'stark'self.namespace = 'stark'def register(self, model_class, handler_class=None, prev=None):""":param model_class: 是models中的數據庫表對應的類。:param handler_class: 處理請求的視圖函數所在的類:param prev: 生成URL的前綴:return:"""if not handler_class:handler_class = StarkHandlerself._registry.append({'model_class': model_class, 'handler': handler_class(self, model_class, prev), 'prev': prev})def get_urls(self):patterns = []for item in self._registry:model_class = item['model_class']handler = item['handler']prev = item['prev']app_name, model_name = model_class._meta.app_label, model_class._meta.model_nameif prev:patterns.append(re_path(r'^%s/%s/%s/' % (app_name, model_name, prev,), (handler.get_urls(), None, None)))else:patterns.append(re_path(r'^%s/%s/' % (app_name, model_name,), (handler.get_urls(), None, None)))return patterns@propertydef urls(self):return self.get_urls(), self.app_name, self.namespacesite = StarkSite()

?

二、業務代碼

from stark.service.core_func import site, StarkHandler, StarkModelForm, get_choice_textfrom web import modelsclass UserInfoModelForm(StarkModelForm):class Meta:model = models.UserInfofields = ['name', 'gender', 'classes', 'age', 'email']class DepartmentHandler(StarkHandler):list_display = ['title']class UserInfoHandler(StarkHandler):per_page_data = 5order_list = ['gender']model_form_class = UserInfoModelFormsearch_list = ['name__contains', 'email__contains', ]list_display = ['name',get_choice_text('性別', 'gender'),get_choice_text('班級', 'classes'),'age', 'email', 'department',StarkHandler.display_edit,StarkHandler.display_delete,]def save(self, form, is_update=False, *args, **kwargs):form.instance.department_id = 1form.save()site.register(models.Department, DepartmentHandler) # 給部門的url增加了前綴:/stark/web/department/private/ site.register(models.UserInfo, UserInfoHandler)

?

三、模板渲染

{% extends 'layout.html' %}{% block css %}<link rel="stylesheet" href=""> {% endblock css %}{% block content %}<div class="custom-container">{% if add_btn %}<div class="up-down-space left">{{ add_btn|safe }}</div>{% endif %}<!-- 搜索 -->{% if search_list %}<div class="up-down-space right"><form method="get" class="form-inline"><div class="form-group"><input class="form-control" type="text" name="q" value="{{ search_value }}"placeholder="關鍵字搜搜"><button class="btn btn-primary" type="submit"><i class="fa fa-search" aria-hidden="true"></i></button></div></form></div>{% endif %}<!-- 搜索結束 --><table class="table table-bordered"><thead><tr>{% for item in header_list %}<th>{{ item }}</th>{% endfor %}</tr></thead><tbody>{% for row in body_list %}<tr>{% for ele in row %}<td>{{ ele }}</td>{% endfor %}</tr>{% endfor %}</tbody></table><nav><ul class="pagination">{{ pager.page_html|safe }}</ul></nav></div> {% endblock content %}

?

?

?

?

轉載于:https://www.cnblogs.com/lshedward/p/10589527.html

總結

以上是生活随笔為你收集整理的strak组件(9):关键字搜索的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产资源网站 | 亚洲精品久久久久avwww潮水 | 久久精品视频观看 | 不卡av在线免费观看 | 免费一级片网址 | 在线电影一区二区 | av男人的天堂在线 | www.插插 | 国产xxx在线| 久久伊人一区 | 久久国产香蕉视频 | www.射| 东北少妇不戴套对白第一次 | 国产亚洲午夜 | 亚洲少妇第一页 | 美女搞黄视频网站 | 日韩中文字幕网站 | 国产性猛交xx乱 | 国产精选久久 | 亚洲综合图色 | 欧美综合自拍亚洲综合图片区 | 黄色不打码视频 | 在线精品视频免费观看 | 亚洲一区二区三区免费在线观看 | 日本亚洲一区 | www.日日干| 亚洲精品在线播放视频 | 激情综合站| 人人干人人看 | 久草资源| 精品视频www| 成人免费黄色网 | 日韩成人综合 | 99精品乱码国产在线观看 | 亚洲精品aaaaa| 国产欧美123 | 爱射综合 | 二区不卡| 97超碰站 | 久久99久久99精品中文字幕 | 色呦呦视频 | 永久看看免费大片 | 午夜影院在线观看 | 亚洲精品日产精品乱码不卡 | 亚洲在线一区二区 | 久青草资源福利视频 | 亚洲午夜一区二区 | 精品免费在线观看 | 欧美经典一区二区 | 色香影院| 超碰人人干| www.男人的天堂.com | 香蕉视频在线网址 | 午夜国产精品视频 | 中文字幕+乱码+中文 | 日本一区二区成人 | 亚洲欧美视频一区 | 四季av一区二区三区免费观看 | 操视频网站 | 日韩性高潮 | 乌克兰av在线 | 国产二区三区视频 | 免费一级a毛片夜夜看 | 性欧美大战久久久久久久久 | 亚洲色图激情小说 | 黄色在线视频观看 | 国产精品网址 | 人人爽人人爱 | 性插视频在线观看 | 久久天天综合 | 超碰人人超碰 | 亚洲一区在线电影 | 熟女视频一区二区三区 | 偷拍一区二区三区四区 | 日韩中文字幕一区二区 | 精品成人免费一区二区在线播放 | 国产第一页屁屁影院 | 亲切的金子餐桌片段的金子 | 国产女主播在线观看 | 国产真人毛片 | jizz日本大全 | 日韩av一卡二卡 | 最近中文字幕无免费 | 激情宗合 | 午夜欧美在线 | 亚洲成人网络 | 91超薄丝袜肉丝一区二区 | 日本高清视频一区二区 | 91极品身材尤物theporn | 好吊色视频988gao在线观看 | 国产丝袜视频在线观看 | 国产巨乳在线观看 | 五月色婷 | 亚洲国产一区二区三区a毛片 | 午夜天堂在线 | 久操免费视频 | 破处视频在线观看 | 黄色三级a | 国产精品久久久久久69 |