ModelForm 返回字段是必需的,不保存到 sqliteDB
ModelForm returning field is required, not saving to sqliteDB
每次我尝试保存我的表单时,我的模板 returns "This Field is required"。问题是我已经填写了那个字段,这是我唯一需要填写的字段。我有点沮丧,我觉得这个论坛会因为问这个问题而把我撕成碎片,但是有人可以看看吗并告诉我我做错了什么。提前致谢!
models.py
class TimeClockIN(models.Model):
timestamp = models.DateTimeField()
driver_number = models.IntegerField(max_length=8)
driver = models.ForeignKey(Driver, blank=True)
forms.py
class ClockInForm(forms.ModelForm):
class Meta:
model = models.TimeClockIN
fields = [
'driver_number',
]
views.py:
def clock_in_view(request):
form = forms.ClockInForm()
pull_all = Driver.objects.all()
if request.method == 'POST':
form = forms.ClockInForm(request.GET)
if form.is_valid():
for driver in pull_all:
if request in driver.driver_number:
time_in_instance = form.save(commit=False)
time_in_instance.timestamp = timezone.now()
time_in_instance.save()
messages.add_message(request, messages.SUCCESS,
"Clocked IN")
return HttpResponseRedirect(reverse('clockin'))
else:
form = forms.ClockInForm()
return render(request, 'clockinform.html', {'form': form})
您向表单实例化传递了错误的内容。
form = forms.ClockInForm(request.POST)
您不需要在 TimeClockIN 模型中有 driver_number 字段(它已经存在于驱动程序字段中)。您可以在检索 driver_number 的地方创建一个普通的 Django 表单。之后,尝试从数据库中获取驱动程序,如果存在,则使用相应的数据创建一个新的 TimeClockIN 实例并保存。这假设每个 driver_number 在驱动程序中都是唯一的。
如果您稍后需要从 TimeClockIN 模型中获取 driver_number,您只需按照驱动程序外键并从那里获取它即可。
型号:
class TimeClockIN(models.Model):
timestamp = models.DateTimeField()
driver = models.ForeignKey(Driver, blank=True)
表格:
class ClockInForm(forms.Form):
driver_number = forms.IntegerField(required=True, max_length=8)
查看:
def clock_in_view(request):
form = forms.ClockInForm()
if request.method == 'POST':
form = forms.ClockInForm(request.POST)
if form.is_valid():
try:
driver = Driver.objects.get(driver_number=form.cleaned_data['driver_number'])
time_in_instance = TimeClockIN()
time_in_instance.timestamp = timezone.now()
time_in_instance.driver = driver
time_in_instance.save()
messages.add_message(request, messages.SUCCESS,
"Clocked IN")
return HttpResponseRedirect(reverse('clockin'))
except Driver.DoesNotExist:
form = forms.ClockInForm()
return render(request, 'clockinform.html', {'form': form})
每次我尝试保存我的表单时,我的模板 returns "This Field is required"。问题是我已经填写了那个字段,这是我唯一需要填写的字段。我有点沮丧,我觉得这个论坛会因为问这个问题而把我撕成碎片,但是有人可以看看吗并告诉我我做错了什么。提前致谢!
models.py
class TimeClockIN(models.Model):
timestamp = models.DateTimeField()
driver_number = models.IntegerField(max_length=8)
driver = models.ForeignKey(Driver, blank=True)
forms.py
class ClockInForm(forms.ModelForm):
class Meta:
model = models.TimeClockIN
fields = [
'driver_number',
]
views.py:
def clock_in_view(request):
form = forms.ClockInForm()
pull_all = Driver.objects.all()
if request.method == 'POST':
form = forms.ClockInForm(request.GET)
if form.is_valid():
for driver in pull_all:
if request in driver.driver_number:
time_in_instance = form.save(commit=False)
time_in_instance.timestamp = timezone.now()
time_in_instance.save()
messages.add_message(request, messages.SUCCESS,
"Clocked IN")
return HttpResponseRedirect(reverse('clockin'))
else:
form = forms.ClockInForm()
return render(request, 'clockinform.html', {'form': form})
您向表单实例化传递了错误的内容。
form = forms.ClockInForm(request.POST)
您不需要在 TimeClockIN 模型中有 driver_number 字段(它已经存在于驱动程序字段中)。您可以在检索 driver_number 的地方创建一个普通的 Django 表单。之后,尝试从数据库中获取驱动程序,如果存在,则使用相应的数据创建一个新的 TimeClockIN 实例并保存。这假设每个 driver_number 在驱动程序中都是唯一的。
如果您稍后需要从 TimeClockIN 模型中获取 driver_number,您只需按照驱动程序外键并从那里获取它即可。
型号:
class TimeClockIN(models.Model):
timestamp = models.DateTimeField()
driver = models.ForeignKey(Driver, blank=True)
表格:
class ClockInForm(forms.Form):
driver_number = forms.IntegerField(required=True, max_length=8)
查看:
def clock_in_view(request):
form = forms.ClockInForm()
if request.method == 'POST':
form = forms.ClockInForm(request.POST)
if form.is_valid():
try:
driver = Driver.objects.get(driver_number=form.cleaned_data['driver_number'])
time_in_instance = TimeClockIN()
time_in_instance.timestamp = timezone.now()
time_in_instance.driver = driver
time_in_instance.save()
messages.add_message(request, messages.SUCCESS,
"Clocked IN")
return HttpResponseRedirect(reverse('clockin'))
except Driver.DoesNotExist:
form = forms.ClockInForm()
return render(request, 'clockinform.html', {'form': form})