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})