Python Django:非空约束失败:crf\u heu.date\u id

Python 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

我有一个非常简单的模型,但无法解决与约束相关的错误

我有两个模型: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.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)