我正在尝试建立一个工作流,其中用户在一页上输入数据,然后必须检查数据并打勾复选框以接受条款和条件。因此,代码必须在继续操作之前检查该复选框是否被选中,但是直到第二步之前都不需要。
这不是一个绑定字段,我认为这就是问题所在-我不需要一个模型来处理工作流,也不想在数据库中以表格形式存储一个简单的临时字段!
我正在运行Django 2.1.5。
我尝试了以下所有可能的组合:
test_form.fields['tickbox'].value
-不存在,这很荒谬test_form.fields['tickbox'] == False
-值完全不变request.POST['tickbox']
似乎不见了?views.py
from django.http import HttpResponse
from django.template import loader
from django.forms import Form, CharField, BooleanField
class test_form(Form):
name = CharField()
tickbox = BooleanField(required=False, initial=False)
def testview(request):
if request.method == 'POST':
testform = test_form(request.POST)
if testform.fields['tickbox'] == True:
do_things()
else:
dont_do_things()
else:
testform = test_form()
template = loader.get_template('testform.html')
context = { 'testform : userform,
}
return HttpResponse(template.render(context, request))
我应该能够测试该字段的值并获得变化的响应,具体取决于用户是否勾选了该框-无论如何,我似乎都得到了True
?
答案 0 :(得分:0)
这是一种使用Class Based Views
和Function Based Views
解决问题的方法:
所以,首先:
forms.py:
from django import forms
class CheckboxForm(forms.Form):
name = forms.CharField()
tickbox = forms.BooleanField(required=False, initial=False)
def clean_tickbox(self):
'''Here we can check if the checkbox is checked or not'''
tickbox = self.cleaned_data.get('tickbox')
if not tickbox:
# Raise an error if the checkbox is not checked
raise forms.ValidationError("You must select this option")
# And return the value
return tickbox
具有基于类的视图:
views.py:
from django.views import View
from django.contrib import messages
class CheckboxView(View):
template_name = 'checkbox.html'
form_class = forms.CheckboxForm
def get(self, request, *args, **kwargs):
form = self.form_class()
return render(request, self.template_name, {'form': form})
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
# check if the form is valid
if form.is_valid():
# Use Django builtin messages framework
messages.success(request, "Checked!")
else:
messages.error(request, "not checked!")
return render(request, self.template_name, {'form': form})
具有基于功能的视图:
from django.contrib import messages
def checkbox_func(request, *args, **kwargs):
template = 'checkbox.html'
if request.method == 'POST':
form = forms.CheckboxForm(request.POST)
# Check if the form is valid
if form.is_valid():
messages.success(request, "Checked!")
else:
messages.error(request, "Not checked!")
else:
form = forms.CheckboxForm()
return render(request, template, {'form': form})
urls.py:
from django.urls import path
from YOUR_APP import views
urlpatterns = [
# ... Your URLS
# Class Based Views
path('checkbox/', views.CheckboxView.as_view(), name="checkbox"),
# Function Based Views
path('checkbox2/', views.checkbox_func, name="checkbox_v2")
]
还有您的模板:checkbox.html
:
{% for message in messages %}
{{message}}
{% endfor %}
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
演示:
答案 1 :(得分:0)
首先,是的,完全可以有FormField
,而无需在Model
中声明它们。
当django已经为您处理了诸如此类的简单情况时,您似乎正在尝试自己进行表单验证。让我们从查看documentation of BooleanField
开始:
- 验证值是否为 True (例如,复选框已选中),如果 该字段具有 required = True
由于这正是您要验证的内容,因此我们可以更改字段定义:
tickbox = BooleanField(required=True, initial=False)
由于文档告诉我们django负责验证复选框是否已实际选中,因此不再需要自定义验证代码。接下来看一下视图并对其进行重构:
def testview(request):
if request.method == 'POST':
testform = test_form(request.POST)
# check if the form is valid (that includes the checkbox being checked)
if testform.is_valid():
do_things()
else:
dont_do_things()
else:
testform = test_form()
template = loader.get_template('testform.html')
context = {'testform': userform} # added a closing single tick
return HttpResponse(template.render(context, request))
因此,无需执行自定义验证,只需调用.is_valid()
实例的Form
方法即可运行验证。如果要访问任何字段而不是使用testform.fields[fieldname]
,则可以执行testform.cleaned_data[fieldname]
,它仅访问已验证的字段。
有关一般形式处理的更多信息,我强烈建议您阅读django的Working with forms。