vkill'blog

“技术本身没有太多价值,掌握了新的思考方式才是真的收获”

django 中使用form实现 类 meta_search 的 search功能

18:26 , vkill
rails 中用惯了 meta_search, django下貌似没这样的包,就自己用form大概实现了下,基本上能满足需求,就是使用很局限,只能用于单个的资源

form中

#search_order_form.py
#encoding: utf-8
from app_ticket.forms.base_form import *
from datetime import datetime

class SearchOrderForm(Form):
    def __init__(self, *args, **kwargs):
        super(self.__class__, self).__init__(*args, **kwargs)
        self.prefix = 'search'

    state = forms.MultipleChoiceField(
        required=False, label=u'状态', initial='', help_text='',
        error_messages={},
        choices=Order.ORDER_STATE_CHOICES,
        widget=forms.CheckboxSelectMultiple({'class': 'checkbox'})
    )
    web_order_id = forms.CharField(
        required=False, label=u'订单号', initial='', help_text='',
        error_messages={},
        widget=forms.TextInput()
    )
    start_time = forms.DateTimeField(
        required=False, label=u'创建时间(开始)', initial='', help_text='',
        error_messages={},
        widget=forms.DateTimeInput({'data-date_select_start':1})
    )
    end_time = forms.DateTimeField(
        required=False, label=u'创建时间(结束)', initial='', help_text='',
        error_messages={},
        widget=forms.DateTimeInput({'data-date_select_end':1})
    )


    def search(self):
        q = ''
        if self.data.has_key('%s-state' % self.prefix):
            states = self.data.getlist('%s-state' % self.prefix)
            if states.__len__() > 0:
                q = "%s__in=%s,%s" % ('state', states, q)

        web_order_id = self.data.get('%s-web_order_id' % self.prefix, None)
        if web_order_id:
            q = "%s__icontains='%s',%s" % ('web_order_id', web_order_id, q)

        start_time = self.data.get('%s-start_time' % self.prefix, None)
        if start_time:
            q = "%s__gte='%s',%s" % ('created_at', start_time, q)

        end_time = self.data.get('%s-end_time' % self.prefix, None)
        if end_time:
            q = "%s__lte='%s',%s" % ('created_at', end_time, q)

        return q



view中

# encoding: utf-8
from app_ticket.views_ext.admin.admin_base_views import *
from app_ticket.models import Order
from app_ticket.forms.search_order_form import SearchOrderForm

class AdminOrdersViews(AdminBaseViews):

    def __init__(self):
        self.search = None

    def index(self, request, *args, **kwargs):
        self.search_form = SearchOrderForm(self.request.REQUEST)
        if self.search_form.is_valid():
            self.search = self.search_form.search()
        self.__collection()
        return self.object_list(self.collection, 'admin/orders/index.html',8)

######################################################################
    def __collection_queryset(self, *args, **kwargs):
        self._collection_queryset = Order.objects.reverse()
        if self.search:
            self._collection_queryset = eval("self._collection_queryset.filter(%s)" % self.search)
        return self._collection_queryset

    def __collection(self, *args, **kwargs):
        self.collection = self.orders = self.__collection_queryset().select_related()
        return self.collection


那么就可以这样使用了,这里可以使用 get ,也可以使用 post,不过index一般都是使用get

http://192.168.1.113/orders/index?search-state=pending

Last modified by vkill on2011/08/05 18:28
类别:python & django | Tags: , , , , , | 0 条评论, 1769 次阅读
网友评论(0):
发表评论:

Nickname: 
Email:
Site URI: