繁体   English   中英

DJANGO 布尔字段表单未保存

[英]DJANGO Boolean Field form not saving

我有一个简单的清单,一个司机在开始他的一天之前必须在想象的场景中打勾。 为了实现这一点,我有一个包含所有勾选框的模型:

from django.db import models
from accounts.models import User
from Inventory.models import trucks


class CheckList(models.Model):
    vehicle = models.ForeignKey(trucks, primary_key=True, on_delete=models.CASCADE)
    driver = models.ForeignKey(User, on_delete=models.CASCADE)
    breaks = models.BooleanField(null=False)
    wipers = models.BooleanField(null=False)
    cargo = models.BooleanField(null=False)  # If the cargo checks false its not a fatal failure but should return a warning to the previous driver saying he didn't do his task successful and warning should be issued from the office
    tires = models.BooleanField(null=False)
    oil = models.BooleanField(null=False)
    gas = models.BooleanField(null=False)
    seatbelt = models.BooleanField(null=False)
    date_created = models.DateTimeField(auto_created=True)

    def __str__(self):
        return self.vehicle.nickname

在模型之后我创建了这个表单:

from django import forms
from .models import CheckList


class driver_form(forms.ModelForm):
    breaks = forms.BooleanField(widget=forms.CheckboxInput, required=False)
    wipers = forms.BooleanField(widget=forms.CheckboxInput, required=False)
    cargo = forms.BooleanField(widget=forms.CheckboxInput, required=False)
    tires = forms.BooleanField(widget=forms.CheckboxInput, required=False)
    oil = forms.BooleanField(widget=forms.CheckboxInput, required=False)
    gas = forms.BooleanField(widget=forms.CheckboxInput, required=False)
    seatbelt = forms.BooleanField(widget=forms.CheckboxInput, required=False)

    class Meta:
        model = CheckList
        fields = "__all__"
        exclude = ['driver', 'date_created', 'vehicle']

最后我添加了这个视图:

def driver_checkout(request, pk):
    items = trucks.objects.all()
    truck = trucks.objects.filter(pk=pk)
    form = driver_form()
    context = {
        'items': items,
        'truck_info': truck,
        'form': form,
    }

    if request.method == "POST":
        if form.is_valid():
            checklist = CheckList(
                vehicle=request.POST['vehicle'],
                driver=request.user,
                breaks=request.POST['breaks'],
                wipers=request.POST['wipers'],
                cargo=request.POST['cargo'],
                tires=request.POST['tires'],
                oil=request.POST['oil'],
                gas=request.POST['gas'],
                seatbelt=request.POST['seatbelt'],
                date_created=datetime.datetime.now(),
            )
            checklist.save()
            return render(request, 'driver/driver_home.html', context)
        else:
            return render(request, 'driver/checkout.html', context)

    else:
        return render(request, 'driver/checkout.html', context)

现在,我的问题是,在我点击 HTML 中呈现表单的保存按钮之前,一切都很好,它无法验证它并再次呈现它,这意味着没有数据被推送到数据库。 我看不出我做错了什么,我之前使用了一个非常相似的代码,它在不同的项目中运行良好。 我猜我可能会错误地实现布尔字段?

ModelForm还可以保存数据,并且可能不太容易出错,您可以使用:

from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
from django.utils import timezone

# …

@login_required
def driver_checkout(request, pk):
    # …
    if request.method == 'POST':
        form = driver_form(request.POST)
        if form.is_valid():
            form.instance.driver = request.user
            form.instance.vehicle_id = pk
            form.instance.date_created = timezone.now()
            checklist = form.save()
            return redirect('name-of-some-view')
        else:
            return render(request, 'driver/checkout.html', context)
    # …

注意:如果 POST 请求成功,您应该进行redirect [Django-doc]以实现Post/Redirect/Get模式 [wiki] 这可以避免您在用户刷新浏览器时发出相同的 POST 请求。


注意:您可以使用@login_required装饰器 [Django-doc]将视图限制为经过身份验证的用户的视图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM