Django-无法在数据库中保存空表单

Django-无法在数据库中保存空表单,django,django-models,django-forms,Django,Django Models,Django Forms,我有一个表单,用户在其中指定律师规范并将数据保存到数据库中。但是我得到一个错误 **null value in column "lawyer_spec" violates not-null constraint** 因此表单中的数据没有得到正确处理 编辑: mthodform\u invalid打印空行,然后打印两个数字(“pk”和“律师id”) forms.py 类makeAppointForm(forms.ModelForm): first_name=forms.CharField(必需=

我有一个表单,用户在其中指定律师规范并将数据保存到数据库中。但是我得到一个错误

**null value in column "lawyer_spec" violates not-null constraint**
因此表单中的数据没有得到正确处理

编辑:

mthod
form\u invalid
打印空行,然后打印两个数字(“pk”和“律师id”)

forms.py

类makeAppointForm(forms.ModelForm):
first_name=forms.CharField(必需=True)
类元:
模型=日历任命已送达
字段=['case']
定义初始值(self,*args,律师id,pk,**kwargs):
super()
律师\u id\u from\u kwargs=律师\u id
律师规格=律师规格.objects.filter(律师=律师id来自律师kwargs)
choices=[(规范律师规范,dict(案例)[规范律师规范])适用于律师规范中的规范]
self.fields['case'].choices=choices
视图.py

@method\u decorator(需要用户,name='dispatch')
类生成应用程序点视图(CreateView):
template_name=“make_appointment.html”
form_class=TestPy.forms.MakeAppointmentForm
model=TestPy.models.calendarAppointsReserved
def get_form_kwargs(自我):
pk=self.kwargs.get('pk')
self.kwargs=super().get_form_kwargs()
self.kwargs={'lawyer\u id':self.request.session['lawyer\u id','pk':pk}
self.kwargs.update(self.kwargs)#self.kwargs包含所有url配置参数
返回self.kwargs
def表单_无效(自身、表单):
打印(表单错误)
打印(self.kwargs.get('pk'))
打印(self.kwargs.get('lawyer_id'))
返回重定向('home')
def表单_有效(自身、表单):
calendar\u model=TestPy.models.CalendarFreeSlot.objects.get(pk=self.kwargs.get('pk'))
calendar\u model.is\u available=False
日历_model.save()
self.object=form.save(commit=False)
self.object.users\u id=self.request.user
self.object.calendar\u free\u id=日历\u模型
self.request.session['free\u calendar\u id']=calendar\u model.pk
self.request.session['lawyer\u id']=calendar\u model.lawyer\u id.pk
self.object.save()
返回重定向('home')
型号.py

class LawyersSpec(models.Model):
律师=models.ForeignKey('MyUser',on_delete=models.PROTECT)
律师规范=模型.SmallIntegerField(选项=案例)
已服务的课程日历任命(models.Model):
calendar\u free\u id=models.ForeignKey('CalendarFreeSlot',on\u delete=models.PROTECT)
users\u id=models.ForeignKey('MyUser',on\u delete=models.PROTECT)
案例=模型.SmallIntegerField(选项=案例)

如何正确处理数据并保存在数据库中?

您在这里犯了一个严重错误:

  • 您的
    CreateView
    适用于
    CalendarAppointsReserved
    模型
  • 您的表格适用于
    律师SPEC
    型号
这是不可能的,因为模型
A
的创建视图要求同一模型
A
使用
ModelForm

将您的表单更改为:

class MakeAppointmentForm(forms.ModelForm):
    first_name = forms.CharField(required=True)

    class Meta:
        model = CalendarAppointmentsReserved
        fields = ['case']

    def __init__(self, *args, lawyer_id, pk, **kwargs):
        super().__init__(*args, **kwargs)
        lawyer_specs = LawyersSpec.objects.filter(lawyer=lawyer_id)
        choices = [(spec.lawyer_spec, dict(CASES)[spec.lawyer_spec]) for spec in lawyer_specs]
        self.fields['case'].choices = choices
现在在您的视图中,您不再需要分配
self.object.case

您还可以通过直接为
get_form_kwargs()
方法分配字典来重置
self.kwargs
。然后,
self.kwargs.update(self.kwargs)
什么也不做,您正在用它自己更新一个dict。所以你在这里丢失了所有的POST数据。正确的方法如下:

def get_form_kwargs(self):
    form_kwargs = super().get_form_kwargs()  # don't mess up self.kwargs
    pk = self.kwargs.get('pk')
    form_kwargs.update({'lawyer_id': self.request.session['lawyer_id'], 'pk': pk})
    return form_kwargs


我已经改变了这一点,现在错误显示列“case”中的null值违反了非null约束详细信息:失败的行包含(29,null,21,3)。能否在form_valid()方法中设置断点并检查form.cleaned_数据和self.request.POST?(如果你不知道如何设置断点,也可以打印出来,但我建议你尽快学习,因为这会让你的生活更轻松)你确实删除了行
self.object.case=self.object.spec
?我删除了
self.object.case=self.object.spec
?self.request.POST是什么?看看get\u form\u kwargs()方法中的逻辑。那不行,为什么?有什么问题吗?如果我把
self.kwargs.get
放在
super()
之后,它没有'pk'值self.kwargs=super(),在下一行self.kwargs={..}。与写入
a=1相同;a=2
。您认为
a
的值是多少?最后一个问题,我如何绑定表单?因为我已经读到我的问题是未绑定表单,但我不知道如何绑定它,因为它是动态生成的?当form.data不是None时,它会被绑定,这是在传递数据时发生的。在上面的代码中,您删除了它通过super()获得的所有表单kwargs。get_form_kwargs()包含数据,这就是为什么您的表单没有绑定。只要修复代码的这一部分,您的表单就会被绑定。