Django - 基于GET参数在搜索表单上设置复选框的更好方法

时间:2013-06-26 18:14:44

标签: django django-forms

我已经做了很多搜索,但似乎这个特定品牌的表单创建在任何地方都没有解决。

我正在创建一个搜索页面,用于查询数据库中是否有属性等于或高于给定阈值的所有元素的集合。现在我有一个简单的表单,它有5个属性,每个属性有5个阈值,每个都有自己的复选框,即。

attrib_1 X threshold 1 X threshold 2 X threshold 3 X threshold 4 X threshold 5
attrib_2 X threshold 1 X threshold 2 X threshold 3 X threshold 4 X threshold 5  
... etc ...

HTML看起来像这样:

  <div class= "form-inline">
    <label>Attribute 1</label>
    <label class="checkbox inline">
      <input type="checkbox" name="attrib 1" value="1"> Very Negative
    </label>
    <label class="checkbox inline">
      <input type="checkbox" name="attribt 1" value="2"> Negative
    </label>
    <label class="checkbox inline">
      <input type="checkbox" name="attrib 1" value="3"> Nonfactor
    </label>
    <label class="checkbox inline">
      <input type="checkbox" name="attrib 1" value="4"> Positive
    </label>      
    <label class="checkbox inline">
      <input type="checkbox" name="attrib 1" value="5"> Very Positive
    </label>
  </div>

然后我使用GET参数中的信息搜索数据库。当我显示搜索结果时,确保复选框反映搜索查询的优雅方法是什么?我希望用户将检查一些框,查看结果,然后检查更多以优化搜索,我不希望他们每次提交搜索时都必须重新检查所有框。

我考虑了一些方法来做到这一点。我可以为每个复选框使用if / else语句并相应地填充checked属性。这可行,但似乎不优雅,不是非常干,并且会导致非常复杂的模板。或者,在视图中,我可以创建一个数据结构(列表或元组列表,可能是列表的dict),它可以为每个复选框“检查”或空字符串。这将导致更清晰的模板,但我怀疑有更正确的Django / Pythonic方式来做到这一点。我也考虑过一种自定义形式,但这似乎试图在一个圆孔中安装一个方形钉。

那么,有什么优雅的方法可以确保根据GET参数正确检查搜索表单上的复选框?

1 个答案:

答案 0 :(得分:1)

我假设您正在使用刷新而不是AJAX回到页面。在这种情况下......

我将假设(根据Django标准)您已将所有这些复选框作为Django表单的一部分。在这种情况下,您可以传递表单一系列参数(我建议使用字典),其中包含所有复选框的初始值。

class SearchQuery(forms.form)

#Adding an init will allow us to pass arguments to this form In
# This case, a single dictionary argument named 'context'
    def __init__(self, *args, **kwargs)
        checkbox_context = kwargs.pop('context')
        super(SearchQuery,self).__init__(*args, **kwargs)
        #Now, instead of doing a bunch of if statements, we can say that
        # our dictionary passed a series of True and False keys that will
        # tell us how our checkboxes should be, in their initial state
        self.fields['checkbox_one'].initial = context['box1']

    checkbox_one = forms.BooleanField()

所以,假设我们通过context = {'box1':True},然后我们的复选框将以初始值'True'或'Checked'呈现