Python Django:非空约束失败:crf\u heu.date\u id
我有一个非常简单的模型,但无法解决与约束相关的错误 我有两个模型:Jours和Heures与OneToMany关系链接(一个Jours实例可以有多个Heures实例) 我有一个表单可以在Heures中添加记录,但有一个错误我不理解: 非空约束失败:crf\U heu.date\U id 型号.pyPython Django:非空约束失败:crf\u heu.date\u id,python,django,constraints,Python,Django,Constraints,我有一个非常简单的模型,但无法解决与约束相关的错误 我有两个模型:Jours和Heures与OneToMany关系链接(一个Jours实例可以有多个Heures实例) 我有一个表单可以在Heures中添加记录,但有一个错误我不理解: 非空约束失败:crf\U heu.date\U id 型号.py class Jours(models.Model): _safedelete_policy = SOFT_DELETE_CASCADE jou_ide = models.AutoFi
class Jours(models.Model):
_safedelete_policy = SOFT_DELETE_CASCADE
jou_ide = models.AutoField(primary_key=True)
jou_dat = models.DateField("Date du pointage", null=True, blank=True)
log = HistoricalRecords()
class Meta:
db_table = 'crf_jou'
verbose_name_plural = 'Dates'
ordering = ['jou_ide']
def __str__(self):
return f"{self.jou_dat}"
class Heures(models.Model):
_safedelete_policy = SOFT_DELETE_CASCADE
heu_ide = models.AutoField(primary_key=True)
date = models.ForeignKey(Jours, on_delete = models.CASCADE)
heu_dat = models.TimeField("Heure du pointage", null=True, blank=True,auto_now_add=True)
heu_cod = models.IntegerField("Code employé", null=True, blank=True)
heu_com = models.CharField("Commentaires", max_length = 150, null=True, blank=True)
log = HistoricalRecords()
class Meta:
db_table = 'crf_heu'
verbose_name_plural = 'Heures'
ordering = ['heu_ide']
def __str__(self):
return f"{self.heu_dat}"
@login_required
def index(request):
if request.method == "POST":
form = HeuresForm(request, data=request.POST or None)
if form.is_valid():
heu_cod = form.cleaned_data['heu_cod'],
heu_com = form.cleaned_data['heu_com'],
date_id = Jours.objects.get(jou_dat = datetime.date.today()).jou_dat
form.save()
return redirect('home')
else:
form = HeuresForm(request)
return render(request, 'pointage/index.html', {'form': form})
class HeuresForm(forms.ModelForm):
# surcharge méthode constructeur (__init__) pour avoir accès aux variables de sessions
# https://stackoverflow.com/questions/3778148/django-form-validation-including-the-use-of-session-data
def __init__(self, request, *args, **kwargs):
self.request = request
super(HeuresForm, self).__init__(*args, **kwargs)
class Meta:
model = Heures
fields = ('heu_cod','heu_com',)
heu_dat= forms.CharField(label ='Heure du pointage', widget=forms.TimeInput(),initial = datetime.datetime.now,)
heu_cod = forms.CharField(label ='Code employé', widget=forms.PasswordInput())
heu_com = forms.CharField(label ='Commentaires', widget=forms.TextInput())
视图.py
class Jours(models.Model):
_safedelete_policy = SOFT_DELETE_CASCADE
jou_ide = models.AutoField(primary_key=True)
jou_dat = models.DateField("Date du pointage", null=True, blank=True)
log = HistoricalRecords()
class Meta:
db_table = 'crf_jou'
verbose_name_plural = 'Dates'
ordering = ['jou_ide']
def __str__(self):
return f"{self.jou_dat}"
class Heures(models.Model):
_safedelete_policy = SOFT_DELETE_CASCADE
heu_ide = models.AutoField(primary_key=True)
date = models.ForeignKey(Jours, on_delete = models.CASCADE)
heu_dat = models.TimeField("Heure du pointage", null=True, blank=True,auto_now_add=True)
heu_cod = models.IntegerField("Code employé", null=True, blank=True)
heu_com = models.CharField("Commentaires", max_length = 150, null=True, blank=True)
log = HistoricalRecords()
class Meta:
db_table = 'crf_heu'
verbose_name_plural = 'Heures'
ordering = ['heu_ide']
def __str__(self):
return f"{self.heu_dat}"
@login_required
def index(request):
if request.method == "POST":
form = HeuresForm(request, data=request.POST or None)
if form.is_valid():
heu_cod = form.cleaned_data['heu_cod'],
heu_com = form.cleaned_data['heu_com'],
date_id = Jours.objects.get(jou_dat = datetime.date.today()).jou_dat
form.save()
return redirect('home')
else:
form = HeuresForm(request)
return render(request, 'pointage/index.html', {'form': form})
class HeuresForm(forms.ModelForm):
# surcharge méthode constructeur (__init__) pour avoir accès aux variables de sessions
# https://stackoverflow.com/questions/3778148/django-form-validation-including-the-use-of-session-data
def __init__(self, request, *args, **kwargs):
self.request = request
super(HeuresForm, self).__init__(*args, **kwargs)
class Meta:
model = Heures
fields = ('heu_cod','heu_com',)
heu_dat= forms.CharField(label ='Heure du pointage', widget=forms.TimeInput(),initial = datetime.datetime.now,)
heu_cod = forms.CharField(label ='Code employé', widget=forms.PasswordInput())
heu_com = forms.CharField(label ='Commentaires', widget=forms.TextInput())
forms.py
class Jours(models.Model):
_safedelete_policy = SOFT_DELETE_CASCADE
jou_ide = models.AutoField(primary_key=True)
jou_dat = models.DateField("Date du pointage", null=True, blank=True)
log = HistoricalRecords()
class Meta:
db_table = 'crf_jou'
verbose_name_plural = 'Dates'
ordering = ['jou_ide']
def __str__(self):
return f"{self.jou_dat}"
class Heures(models.Model):
_safedelete_policy = SOFT_DELETE_CASCADE
heu_ide = models.AutoField(primary_key=True)
date = models.ForeignKey(Jours, on_delete = models.CASCADE)
heu_dat = models.TimeField("Heure du pointage", null=True, blank=True,auto_now_add=True)
heu_cod = models.IntegerField("Code employé", null=True, blank=True)
heu_com = models.CharField("Commentaires", max_length = 150, null=True, blank=True)
log = HistoricalRecords()
class Meta:
db_table = 'crf_heu'
verbose_name_plural = 'Heures'
ordering = ['heu_ide']
def __str__(self):
return f"{self.heu_dat}"
@login_required
def index(request):
if request.method == "POST":
form = HeuresForm(request, data=request.POST or None)
if form.is_valid():
heu_cod = form.cleaned_data['heu_cod'],
heu_com = form.cleaned_data['heu_com'],
date_id = Jours.objects.get(jou_dat = datetime.date.today()).jou_dat
form.save()
return redirect('home')
else:
form = HeuresForm(request)
return render(request, 'pointage/index.html', {'form': form})
class HeuresForm(forms.ModelForm):
# surcharge méthode constructeur (__init__) pour avoir accès aux variables de sessions
# https://stackoverflow.com/questions/3778148/django-form-validation-including-the-use-of-session-data
def __init__(self, request, *args, **kwargs):
self.request = request
super(HeuresForm, self).__init__(*args, **kwargs)
class Meta:
model = Heures
fields = ('heu_cod','heu_com',)
heu_dat= forms.CharField(label ='Heure du pointage', widget=forms.TimeInput(),initial = datetime.datetime.now,)
heu_cod = forms.CharField(label ='Code employé', widget=forms.PasswordInput())
heu_com = forms.CharField(label ='Commentaires', widget=forms.TextInput())
由于不允许
您没有在此处指定date=models.ForeignKey(Jours,on_delete=models.CASCADE)
为空,您需要或允许该值,或在表单上添加此字段:
class HeuresForm(forms.ModelForm):
def __init__(self, request, *args, **kwargs):
self.request = request
super(HeuresForm, self).__init__(*args, **kwargs)
gender = forms.ModelChoiceField(queryset=Heures.objects.all(),
to_field_name = 'date',
empty_label="Select heures")
class Meta:
model = Heures
fields = ('heu_cod', 'heu_com', 'gender)
heu_dat= forms.CharField(label ='Heure du pointage', widget=forms.TimeInput(),initial = datetime.datetime.now,)
heu_cod = forms.CharField(label ='Code employé', widget=forms.PasswordInput())
heu_com = forms.CharField(label ='Commentaires', widget=forms.TextInput())
您可能需要将“jou_ide”更改为id,这是Jours上的自动字段。在此之后,可能需要Heures模型中的“null=True”来表示日期列 您没有在这里指定
date=models.ForeignKey(Jours,on_delete=models.CASCADE)
在crf\u heu
表中,该字段可以是NULL
,并且在您的表单中您没有添加此字段。但是它不能是NULL,因为它是DjangoI中的外键。我已经添加NULL=True:date=models.ForeignKey(Jours,on_delete=models.CASCADE,null=True),当我注册一个Jours实例时,它确实解决了错误,但日期保持为空(null)