【问题标题】:Gathering information from few forms in django从 django 中的几种形式收集信息
【发布时间】:2013-07-13 19:37:29
【问题描述】:

我正在创建简单的搜索引擎,所以我在页面顶部有一个输入文本字段,旁边有一个“搜索”按钮。这一切都在一种形式中,并“产生”例如/q=search%20query

在侧边栏中,我有另一个带有过滤器的表单的面板,比如fromto。我希望有可能创建像/q=search%20query&from=20&to=50 这样的链接。我想知道第一种形式的按钮应该如何从第二种形式收集信息。

我在某处读到有类似 formset 的东西,但是我没有找到信息表明它们可以用于类似的东西。

【问题讨论】:

    标签: python django django-forms formset


    【解决方案1】:

    我认为通过制作一个包含搜索词和任何过滤器的表单最容易解决这个问题;您可以将表单元素放置在任何您想要的位置。

    您的表单必须类似于:

    from django import forms
    
        class MySearchForm(forms.Form):
            FILTERS = (("lt20", "Less than 20"),
                        ("20to50", "Twenty to fifty"),
                      )
            term = forms.CharField()
            filters = forms.MultipleChoiceField(widget = CheckBoxSelectMultiple, choices = FILTERS)
    

    然后您将不得不手动显示表单,因此您可以在模板中随意拆分它。换句话说,您必须使用{{form.term}}{{form.filters}},而不是使用像 {{form.as_p}} 这样的过滤器。

    您还可以在模型中定义您的过滤器,以便您可以更轻松地更改它们、添加到它们等等,st:

    # in models.py
    class = Filters(models.Model):
        name = models.CharField(max_length=20)
    
    # in your form definition,
    from your_app_name.models import Filters
    
    class MySearchForm(forms.Form):
        term = forms.CharField()
        filters = forms.ModelChoiceField(queryset = Filters.objects.all(), widget = CheckBoxSelectMultiple)
    

    【讨论】:

    • 我的两个表单都在不同的文件中。要按照您的建议进行操作,我必须合并它们,并在它们之间创建一个包含许多其他 html 元素的巨大表单。
    • 您可以将这两个表单放入模板中,只要它们位于同一个<form> 标记内,只需为其添加前缀即可。见the docs here。另一种选择是制作一个 third 形式,将它们两个子类化,如下所示:class MyBigForm(Form1, Form2):
    【解决方案2】:

    我刚刚想到一个想法,我可以在第一种形式中创建额外的隐藏字段,这些隐藏字段可以通过 JavaScript 与第二种形式的字段同步。这将产生少量冗余,但似乎很容易实现。

    这是个好主意吗?

    【讨论】:

    • 当然可以。如果改为定义第三种形式,它继承这两种形式的子类,这将更清晰(并且更不容易中断)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多