【问题标题】:Retain select option value after submit in Django在 Django 中提交后保留选择选项值
【发布时间】:2016-05-11 03:24:59
【问题描述】:

我没有使用 Ajax 或 django 表单。我在表单标签中有纯 HTML 选择标签,并在我的视图中发送选定的选项值。我想在提交后保留选择选项值。目前,无论我的选择如何,它的默认值都是 1。帮助将不胜感激。

这是我的模板代码:

            <form method = "post" action = "{% url 'index' %}">
                {% csrf_token %}
                <label class="mainlbl">Vega</label>
                <select name = "drop1" >
                    <option value="1">1</option>
                    <option value="2">2</option>
                    <option value="3">3</option>
                    <option value="4">4</option>
                    <option value="5">5</option>
                    <option value="6">6</option>
                    <option value="7">7</option>
                    <option value="8">8</option>
                    <option value="9">9</option>
                    <option value="10">10</option>
                    <option value="11">11</option>
                    <option value="12">12</option>
                </select>
                <input class="btn btn-ocean btn-side-bar" type = "submit" value="Submit">
            </form>

这是我的看法:

def index(request):
    if request.method == "POST":
        vega = request.POST['drop1']
        vega = int(vega)
        gvo = GVOptimize('NSE', 'Nifty')
        data = gvo.get_optimal_strategies(vega)
        str1 = None

        for i in range(0, len(data)):
            if i == 0:
                str1 = data[i]

            elif i == 1:
                str2 = data[i]

            elif i == 2:
                str3 = data[i]

            elif i == 3:
                str4 = data[i]

            else:
                break
        context_dict = {'str1': str1, 'str2': str2, 'str3': str3, 'str4': str4 'vega': vega}
        return render(request, 'demo/dashboard.html', context_dict)
    else:
        context_dict = {}
        return render(request, 'demo/dashboard.html', context_dict)

【问题讨论】:

  • 您有什么理由不使用 django 表单吗?
  • for 循环的意义何在?为什么有四个不同的str* 变量,您只使用它们来填充上下文字典?即使您不了解 dict 理解,为什么不只是 context_dict = {'str1': data[0], ...}
  • @Sayse yup..我已经开发了前端,不想玩设计部分。
  • 表单完全不会影响前端
  • 哦,当然,您可以在上下文中传回选定的索引,然后检查每个选项是否等于选定的索引,如果是则选择它。 (提示:您也可以对选项使用 for 循环)。但这是一种非常老套的方法来绕过您可以在此处使用表单的事实。

标签: html django django-templates


【解决方案1】:

如果您真的坚持要采用一种不合时宜的方式来维护所选选项,您可以更改表单以检查每个选项,看看它是否等于您在上下文中传回的数字

<form method = "post" action = "{% url 'index' %}">
    {% csrf_token %}
    <label class="mainlbl">Vega</label>
    <select name = "drop1" >
        {% for idx in "useaformpls!" %}
            <option value="{{ forloop.counter }}" {% if context_val == forloop.counter %}selected {% endif %}>
                 {{ forloop.counter }}
             </option>
        {% endfor %}
    </select>
    <input class="btn btn-ocean btn-side-bar" type = "submit" value="Submit">
</form>

其中context_val 等于您在视图的上下文数据中传回的索引。

【讨论】:

  • 亲爱的未来读者,我不为这段代码感到自豪,也不宽恕它的使用。
  • 谢谢!尽管下拉列表中的值显示了两次。我的意思是 1-12 和 1-12
  • @RamanBalyan - 您是否保留了现有的选项代码?...这在我提供的 sn-p 中是不可能的。
【解决方案2】:

我不确定这是否是一个好习惯,但您可以尝试在您的视图中创建一个函数。

def send_selected_combo(self):
    value_from_select = self.request.GET.get('select_html')
    return value_from_select

然后你可以在你的模板中调用函数。

<select name="select_html" selected="id_selector">
    <option value="combo_value" {%if.view.send_selected_combo=="combo_value"%} selected {%endif%}></option>
</select>

【讨论】:

    【解决方案3】:

    这个答案只在这里,因为这不是应该如何解决的!

    您正在使用 Django,所以请使用专门用于此类用途的表单,使用它们的原因有很多,但重要的却很少:

    • 简单代码
    • 直接使用具有通用视图的表单
    • 数据验证(是的,您无需检查这是否为整数,或者是否有人在入侵您的页面并发布超出您select 范围的值)
    • 数据逃逸 - 是的,没有更多愚蠢的安全漏洞
    • 与表单元素相关的验证,允许重新提交数据并向用户显示确切的错误位置

    别告诉我这是更多的工作......

    forms.py

    class MyForm(forms.Form):
        drop1 = forms.IntegerField('Vega', choices=[(x,x) for x in range(1, 13)])
    

    views.py

    def index(request):
        context_dict = {}
        if request.method == "POST":
            form = MyForm(data=request.POST)
            if form.is_valid():
                vega = form.cleaned_data['drop1']
                gvo = GVOptimize('NSE', 'Nifty')
                data = gvo.get_optimal_strategies(vega)
                (str1, str2, str3, str4) = data[:4]
                context_dict = {'str1': str1, 'str2': str2,
                                'str3': str3, 'str4': str4 'vega': vega}
        else:
            form = MyForm()
    
        context_dict['form'] = form
    
        return render(request, 'demo/dashboard.html', context_dict)
    

    dashboard.html

    {% if form.is_valid %}
        <p>Vega: {{ vega }}</p>
    {% else %}
    <form method="post" action="{% url 'index' %}">{% csrf_token %}
        {{ form }}
        <input class="btn btn-ocean btn-side-bar" type="submit" value="Submit">
    </form>
    {% endif %}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 2021-05-27
      • 2016-12-15
      • 2015-02-25
      • 2020-04-10
      相关资源
      最近更新 更多