[英]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.