簡體   English   中英

將kwargs從模板傳遞到視圖?

[英]Passing kwargs from template to view?

正如您可能從我的問題中看出來的那樣,我是python和django的新手。 我想使用**kwargs允許模板中的查詢集動態過濾器規范。 我在想像是一堆kwarg的選擇框。 例如:

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

django是否可以為我還沒有遇到的這個問題提供一個優雅的解決方案?

我想以一種通用的方式解決此問題,因為我需要將此過濾器傳遞給其他視圖。 例如,我需要將過濾器傳遞給分頁的患者列表視圖,以便分頁知道它正在處理哪些項目。 另一個示例是此過濾器必須傳遞到患者詳細信息頁面,以便您可以使用上一個/下一個鏈接來遍歷患者的過濾列表。

謝謝,皮特

更新:

FilterSpecification是建立一個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

我很樂意對此方法發表評論,並聽聽其他解決方案。

與其面對SQL注入的可怕危險,不如不給每個select選項分配一個值,並讓您的表單處理視圖基於該值運行所選查詢,就可以了。

從頁面到視圖傳遞數據庫查詢的參數只是在請求災難。 Django的創建是為了避免這種情況。

關於您的更新:很遺憾,FilterSpecs是Django這些(少有的)缺少公共文檔的文件之一。 因此,不能保證他們將繼續保持工作狀態。

另一種方法是使用Alex Gaynor的django過濾器 ,該過濾器看起來經過深思熟慮。 我將在下一個項目中使用它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM