没有模型就可以使用/测试Django的BooleanField的值吗?

时间:2019-01-27 01:46:59

标签: django django-forms

我正在尝试建立一个工作流,其中用户在一页上输入数据,然后必须检查数据并打勾复选框以接受条款和条件。因此,代码必须在继续操作之前检查该复选框是否被选中,但是直到第二步之前都不需要。

这不是一个绑定字段,我认为这就是问题所在-我不需要一个模型来处理工作流,也不想在数据库中以表格形式存储一个简单的临时字段!

我正在运行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

2 个答案:

答案 0 :(得分:0)

这是一种使用Class Based ViewsFunction 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 2 3 4 5 6

答案 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