Django检查复选框是不是被选中
Posted
技术标签:
【中文标题】Django检查复选框是不是被选中【英文标题】:Django check if checkbox is selectedDjango检查复选框是否被选中 【发布时间】:2015-06-25 05:21:39 【问题描述】:我目前正在开发一个相当简单的 django 项目,可以使用一些帮助。它只是一个简单的数据库查询前端。
目前我坚持使用复选框、单选按钮等来优化搜索
我遇到的问题是弄清楚如何知道何时选择了一个(或多个)复选框。到目前为止,我的代码是这样的:
views.py
def search(request):
if 'q' in request.GET:
q = request.GET['q']
if not q:
error = True;
elif len(q) > 22:
error = True;
else:
sequence = Targets.objects.filter(gene__icontains=q)
request.session[key] = pickle.dumps(sequence.query)
return render(request, 'result.html', 'sequence' : sequence, 'query' : q, 'error' : False)
return render(request, 'search.html', 'error': True)
搜索.html
<p>This is a test site</p></center>
<hr>
<center>
% if error == true %
<p><font color="red">Please enter a valid search term</p>
% endif %
<form action="" method="get">
<input type="text" name="q">
<input type="submit" value="Search"><br>
</form>
<form action="" method="post">
<input type='radio' name='locationbox' id='l_box1'> Display Location
<input type='radio' name='displaybox' id='d_box2'> Display Direction
</form>
</center>
我目前的想法是检查选择了哪些复选框/单选按钮,并根据选择的情况查询正确的数据并将其显示在表格中。
具体来说:
如何检查是否选中了特定复选框?以及如何将此信息传递给views.py
【问题讨论】:
您无法在客户端的网络浏览器上执行 Python,因此您需要使用 javascript。 【参考方案1】:单选按钮:
在单选按钮的 HTML 中,您需要所有相关的单选输入共享相同的名称,具有预定义的“值”属性,并且最好有一个环绕的标签标签,如下所示:
<form action="" method="post">
<label for="l_box1"><input type="radio" name="display_type" value="locationbox" id="l_box1">Display Location</label>
<label for="d_box2"><input type="radio" name="display_type" value="displaybox" id="d_box2"> Display Direction</label>
</form>
然后在您的视图中,您可以通过检查 POST 数据中的共享“名称”属性来查找选择了哪个。它的值将是 HTML 输入标记的关联“值”属性:
# views.py
def my_view(request):
...
if request.method == "POST":
display_type = request.POST.get("display_type", None)
if display_type in ["locationbox", "displaybox"]:
# Handle whichever was selected here
# But, this is not the best way to do it. See below...
这可行,但需要手动检查。最好先创建一个 Django 表单。然后 Django 会为你做这些检查:
forms.py:
from django import forms
DISPLAY_CHOICES = (
("locationbox", "Display Location"),
("displaybox", "Display Direction")
)
class MyForm(forms.Form):
display_type = forms.ChoiceField(widget=forms.Radioselect, choices=DISPLAY_CHOICES)
你的模板.html:
<form action="" method="post">
# This will display the radio button HTML for you #
form.as_p
# You'll need a submit button or similar here to actually send the form #
</form>
views.py:
from .forms import MyForm
from django.shortcuts import render
def my_view(request):
...
form = MyForm(request.POST or None)
if request.method == "POST":
# Have Django validate the form for you
if form.is_valid():
# The "display_type" key is now guaranteed to exist and
# guaranteed to be "displaybox" or "locationbox"
display_type = request.POST["display_type"]
...
# This will display the blank form for a GET request
# or show the errors on a POSTed form that was invalid
return render(request, 'your_template.html', 'form': form)
复选框:
复选框的工作方式如下:
forms.py:
class MyForm(forms.Form):
# For BooleanFields, required=False means that Django's validation
# will accept a checked or unchecked value, while required=True
# will validate that the user MUST check the box.
something_truthy = forms.BooleanField(required=False)
views.py:
def my_view(request):
...
form = MyForm(request.POST or None)
if request.method == "POST":
if form.is_valid():
...
if request.POST["something_truthy"]:
# Checkbox was checked
...
进一步阅读:
https://docs.djangoproject.com/en/1.8/ref/forms/fields/#choicefield
https://docs.djangoproject.com/en/1.8/ref/forms/widgets/#radioselect
https://docs.djangoproject.com/en/1.8/ref/forms/fields/#booleanfield
【讨论】:
非常感谢您的回复。我想我将不得不使用 checkboxe 方法。但我对如何使用它有一点了解。在您的第三个嵌套 IF 语句之后,我该如何检查使用了哪些复选框?再次感谢您的回复,由于我是 django 的新手,请多多包涵 :) 在复选框示例中,MyForm 呈现一个带有“Something truthy”标签的复选框。在 my_view() 中,request.POST["something_truthy"] 如果选中该复选框,则为 True,否则为 False。 感谢您的回复!我现在明白这部分了:)我也有后续问题,但如果你能给我一些建议的话。我已经修改了原帖。我的问题是关于过滤特定列,因为我在谷歌上搜索过这个,但找不到我要找的东西。再次感谢! 您应该从这个问题中删除您的后续问题,并将其作为单独的问题。 *** 是为一个特定的问题 >>> 一个特定的答案而设计的,而不是针对某个主题的持续帮助。如果此答案满足您的原始问题,则应将其标记为“已接受”,以便其他有类似问题的人可以轻松找到它。 为了清楚起见,我冒昧地从这个问题的文本中删除了后续问题。如果您需要参考它,您可以在问题的修订历史记录中访问它。【参考方案2】:在模型中:
class Tag:
published = BooleanField()
(...)
在模板中:
% for tag in tags %
<label class="checkbox">
<input type="checkbox" name="tag[]" value="" % if tag.published %checked% endif %>
</label>
% endfor %
假设您将表单作为 POST 发送,所选复选框的值在 request.POST.getlist('tag') 中。
例如:
<input type="checkbox" name="tag[]" value="1" />
<input type="checkbox" name="tag[]" value="2" />
<input type="checkbox" name="tag[]" value="3" />
<input type="checkbox" name="tag[]" value="4" />
说如果检查了 1,4,
check_values = request.POST.getlist('tag')
check_values 将包含 [1,4](被检查的那些值)
【讨论】:
此答案仅适用于存在与表单关联的模型的情况,而在所提出的问题中并非如此。【参考方案3】:% for tag in tags %
<label class="checkbox">
<input type="checkbox" name="tag[]" value=""
% if tag.published %checked% endif %>
</label>
% endfor %
<input type="checkbox" name="tag[]" value="1" />
<input type="checkbox" name="tag[]" value="2" />
<input type="checkbox" name="tag[]" value="3" />
<input type="checkbox" name="tag[]" value="4" />
【讨论】:
请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。以上是关于Django检查复选框是不是被选中的主要内容,如果未能解决你的问题,请参考以下文章