在Django中提交后保留选择选项值

时间:2016-02-02 10:55:50

标签: html django django-templates

我没有使用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)

3 个答案:

答案 0 :(得分:0)

如果您真的坚持使用hacky方式维护所选选项,则可以更改表单以检查每个选项,看它是否等于您在上下文中传回的数字

<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 :(得分:0)

我不确定这是不是很好,但您可以尝试在视图中创建一个功能。

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>

答案 2 :(得分:0)

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

你正在使用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 %}