如何在django views.py中获取所选选项的文本值

kq4fsx7k  于 2022-10-22  发布在  Go
关注(0)|答案(3)|浏览(188)

例如:如果选择了第一个选项Regular,那么如何在views.py中获取值“1”及其文本值“Regular”

<form method = "post" action = "{% url 'index' %}">
{% csrf_token %}
<select name = "drop1" >
    <option value="1">Regular</option>
    <option value="2">Medium</option>
    <option value="3">Large</option>
</select>
<input  type = "submit" value="Submit">
eqqqjvef

eqqqjvef1#

1应在键drop1下以request.POST为单位。
这将帮助您在视图中查看选定的值:

print(request.POST['drop1'])

<option>标记的文本内容不会提交给视图,只会提交value属性内的文本。这是一个HTML和web浏览器设计;Python或Django不控制POST请求中发送的内容。
如果您确实需要在POST请求中获取两个字符串(1Regular),我过去使用的一种解决方法是复制HTML标记中的文本

<option value"1-Regular">Regular</option>

从而发送值1-Regular;然后我在视图中分割了线

v1, v2 = request.POST['drop1'].split('-')
print(v1)
print(v2)

这不是一个完美的解决方案,但它确实对我有效。

rhfm7lfc

rhfm7lfc2#

我能想到的另一个解决方案(也不使用Django表单)是使用Python dict(或list)在视图中保存所有选项:

import collections
DROP1_DICT = collections.OrderedDict(
    (1, 'Regular'),
    (2, 'Medium'),
)

def my_view(request):
    ...
    if request.method == 'POST':
        selected_value = request.POST['drop1']
        selected_label = DROP1_DICT[selected_value]
        print(selected_value)
        print(selected_label)
    else:
        ctx = {
            'drop1_dict': DROP1_DICT,
        }
        return render(request, 'my_template.html', ctx)

并基于以下内容渲染模板:

<form method = "post" action = "{% url 'index' %}">
    {% csrf_token %}
    <select name = "drop1" >
    {% for k, v in drop1_dict.items %}
        <option value="{{ k }}">{{ v }}</option>
    {% endfor %}
    </select>
    <input type="submit" value="Submit">
</form>

当然,如果您简单地使用django表单,那么所有底层处理都会为您完成,您可以跳过这部分代码。

x6492ojm

x6492ojm3#

如果有人陷入相同的场景,并且选择选项来自后端,可以使用ModelChoiceFieldto_field_name属性。例如,如果Regular、Medium和Large是ProductSize模型中名为size字段的选择,请尝试以下形式:

class SearchForm(forms.Form):
    size = forms.ModelChoiceField(
         queryset=ProductSize.objects.all(),
         to_field_name="size",
         widget=forms.Select(attrs={"class": "form-control"}),
         empty_label="Choose")

上面的表单将html中的选项呈现为:

<select name="size" class="form-control select form-select" required="" id="id_size">
    <option value="" selected="">Choose</option>
    <option value="Regular">Regular</option>
    <option value="Medium">Medium</option>
    <option value="Large">Large</option>
</select>

您可以简单地在视图中获取这些值。py by self.request.POST.get("size")。请参阅文档

相关问题