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
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
网友评论(0):


