Django - 空表单不能保存在数据库中



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

**null value in column "lawyer_spec" violates not-null constraint**

因此,表单中的数据未正确处理。

编辑:

mthodform_invalid打印空行,然后打印两个数字("pk"和"lawyer_id"(

forms.py

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_id_from_kwargs = lawyer_id
lawyer_specs = LawyersSpec.objects.filter(lawyer=lawyer_id_from_kwargs)
choices = [(spec.lawyer_spec, dict(CASES)[spec.lawyer_spec]) for spec in lawyer_specs]
self.fields['case'].choices = choices

views.py

@method_decorator(user_required, name='dispatch')
class MakingAppointmentView(CreateView):
template_name = "make_appointment.html"
form_class = TestPy.forms.MakeAppointmentForm
model = TestPy.models.CalendarAppointmentsReserved
def get_form_kwargs(self):
pk = self.kwargs.get('pk')
self.kwargs = super().get_form_kwargs()
self.kwargs = {'lawyer_id': self.request.session['lawyer_id'], 'pk': pk}
self.kwargs.update(self.kwargs)  # self.kwargs contains all url conf params
return self.kwargs

def form_invalid(self, form):
print(form.errors)
print(self.kwargs.get('pk'))
print(self.kwargs.get('lawyer_id'))
return redirect('home')

def form_valid(self, form):
calendar_model = TestPy.models.CalendarFreeSlot.objects.get(pk=self.kwargs.get('pk'))
calendar_model.is_available = False
calendar_model.save()
self.object = form.save(commit=False)
self.object.users_id = self.request.user
self.object.calendar_free_id = calendar_model
self.request.session['free_calendar_id'] = calendar_model.pk
self.request.session['lawyer_id'] = calendar_model.lawyer_id.pk
self.object.save()
return redirect('home')

models.py

class LawyersSpec(models.Model):
lawyer = models.ForeignKey('MyUser', on_delete=models.PROTECT)
lawyer_spec = models.SmallIntegerField(choices=CASES)
class CalendarAppointmentsReserved(models.Model):
calendar_free_id = models.ForeignKey('CalendarFreeSlot', on_delete=models.PROTECT) 
users_id = models.ForeignKey('MyUser', on_delete=models.PROTECT) 
case = models.SmallIntegerField(choices=CASES)

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

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

  • 您的CreateView适用于CalendarAppointmentsReserved模型
  • 您的表单适用于LawyersSpec模型

这是不可能的,因为模型A的创建视图需要同一模型AModelForm

将您的表单更改为:

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)什么都不做,你就是在用它更新一个字典。因此,您在此处丢失了所有 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

最新更新