从模板传递kwargs来查看?

时间:2009-08-13 01:09:19

标签: python django

正如你可以从我的问题中得知,我是python和django的新手。我想使用**kwargs从我的模板中允许查询集的动态过滤器规范。我在想一个像一堆kwargs的精选盒子。例如:

  <select id="filter">
    <option value="physician__isnull=True">Unassigned patients</option>
  </select>

django是否为这个我尚未遇到的问题提供了一个优雅的解决方案?

我试图以通用的方式解决这个问题,因为我需要将此过滤器传递给其他视图。例如,我需要将过滤器传递给分页的患者列表视图,因此分页知道它正在使用哪些项目。另一个例子是必须将此过滤器传递到患者详细信息页面,以便您可以使用上一个/下一个链接迭代已过滤的患者列表。

非常感谢Pete

更新

我想出的是建立FilterSpecification课程:

class FilterSpec(object):
def __init__(self, name, *args):
    super(FilterSpec, self).__init__()
    self.name = name
    self.filters = []

    for filter in args:
        self.add(filter)

def pickle(self):
    return encrypt(pickle.dumps(self))

def add(self, f):
    self.filters.append(f)

def kwargs(self):
    kwargs = {}
    for f in self.filters:
        kwargs = f.kwarg(**kwargs)
    return kwargs

def __unicode__(self):
    return self.name



class Filter(object):
def __init__(self, key, value):
    super(Filter, self).__init__()
    self.filter_key = key
    self.filter_value = value

def kwarg(self, **kwargs):
    if self.filter_key != None:
        kwargs[self.filter_key] = self.filter_value
        return kwargs

然后我可以过滤任何类型的模型:

filterSpec = FilterSpec('Assigned', Filter('service__isnull', False)))
patients = Patient.objects.filter(**filterSpec.kwargs())

我通过序列化,压缩,应用一些对称加密和url-safe base-64编码将这些filterSpec对象从客户端传递给服务器。唯一的缺点是你最终得到这样的URL:

http://127.0.0.1:8000/hospitalists/assign_test/?filter=eJwBHQHi_iDiTrccFpHA4It7zvtNIW5nUdRAxdiT-cZStYhy0PHezZH2Q7zmJB-NGAdYY4Q60Tr_gT_Jjy_bXfB6iR8inrNOVkXKVvLz3SCVrCktGc4thePSNAKoBtJHkcuoaf9YJA5q9f_1i6uh45-6k7ZyXntRu5CVEsm0n1u5T1vdMwMnaNA8QzYk4ecsxJRSy6SMbUHIGhDiwHHj1UnQaOWtCSJEt2zVxaurMuCRFT2bOKlj5nHfXCBTUCh4u3aqZZjmSd2CGMXZ8Pn3QGBppWhZQZFztP_1qKJaqSVeTNnDWpehbMvqabpivtnFTxwszJQw9BMcCBNTpvJf3jUGarw_dJ89VX12LuxALsketkPbYhXzXNxTK1PiZBYqGfBbioaYkjo%3D

我很想对这种方法发表一些意见并听取其他解决方案。

2 个答案:

答案 0 :(得分:1)

为什么不为每个选择选项分配一个值,让你的表单处理视图根据值运行选定的查询,而不是面对SQL注入的可怕危险。

将数据库查询的参数从页面传递到另一个视图只是要求发生灾难。 Django旨在避免这种情况。

答案 1 :(得分:0)

关于您的更新:不幸的是,FilterSpecs是缺少公共文档的那些(罕见)Django之一。因此,无法保证他们会像以前一样继续工作。

另一种方法是使用Alex Gaynor的django-filter看起来非常深思熟虑。我将把它们用于我的下一个项目。