Django.db.utils.IntegrityError: NOT NULL constraint failed: main_companyclass.FinancialYearEnd

Я сталкиваюсь с вышеупомянутой ошибкой при попытке запустить мое приложение после создания формы, которая обновляет только 1 поле.

Что я пытаюсь достичь следующим образом:

Пользователь вводит клиента в приложение и сохраняет его в базе данных, после этого клиент должен отображаться на странице контрольного списка, где он будет отображать некоторые подробности о клиенте и показывать флажок (isdone_IT14), чтобы сказать, был ли заказ клиента выполнен.

Проблема в том, что когда пользователь устанавливает флажок и сохраняет его, не похоже, что он обновляет эту запись в модели.

Я создал следующую форму, чтобы помочь в этом:

class CompanyIT14Form(ModelForm):
    class Meta:
        model = CompanyClass
        fields= ['isdone_IT14']

Но это явно не правильное решение. Кто-нибудь знает лучший способ решения этой ошибки?

Пожалуйста, посмотрите приведенный ниже код:

Models.py:

class CompanyClass(models.Model):
    #Company Only Fields
    CompanyName = models.CharField(max_length=50 , blank=False)
    RefNo = models.CharField(max_length=50 , blank=False )
    FinancialYearEnd = models.DateField(auto_now=False, auto_now_add=False, null=False)

    #Contact Details
    ContactPerson = models.CharField( max_length=50, blank=False)
    EmailAddress = models.CharField(max_length=50, blank=False)

    #Services
    IT14 = models.BooleanField(default=True)

    # CheckList
    isdone_IT14 = models.BooleanField(default=False)

    def __str__(self):
        return ( self.CompanyName)

Forms.py:

class CompanyForm(ModelForm):
    class Meta:
        model = CompanyClass
        fields = '__all__'
        widgets = {
            'FinancialYearEnd' : forms.SelectDateWidget,
        }

class CompanyIT14Form(ModelForm):
    class Meta:
        model = CompanyClass
        fields= ['isdone_IT14']

Views.py:

class companyIT14(View):

    def get(self,request):
        it14s = CompanyClass.objects.filter(IT14 = True).order_by('CompanyName')
        form = CompanyIT14Form()
        content = {'it14s':it14s , 'form':form}
        return render(request, 'main/Checklists/companyIT14.html', content)

    def post(self,request):
        it14s = CompanyClass.objects.filter(IT14=True).order_by('CompanyName')
        form = CompanyIT14Form(request.POST)
        content = {'it14s': it14s, 'form': form}
        if form.is_valid():
            form.save()
            return redirect('companyIT14')
        else:
            print(form.errors)
            return render(request, 'main/checklistHome.html', content)

Template.html:

{% extends "main/base.html"%}
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
{% block content %}
<body>
<br>
    {% if user.is_authenticated %}
    <h1 class="h1" style="text-align: center">Companies IT14's</h1>

<table class="table table-hover table-dark"  style="width: 80%;text-align: center;">
    <thead>
        <tr>
            <th scope="col">Company</th>
            <th scope="col">Ref No.</th>
            <th scope="col">Contact Person</th>
            <th scope="col">E-mail Address</th>
            <th scope="col">Completed?</th>
            <th scope="col">Save</th>
        </tr>
    </thead>
    <tbody>
    {% for x in it14s %}
        <tr>
            <th scope="row">{{ x.CompanyName }}</th>
            <th>{{ x.RefNo }}</th>
            <th>{{ x.ContactPerson }}</th>
            <th>{{ x.EmailAddress }}</th>
            <form class="form-group mt-4" method="post">
            {% csrf_token %}
            <th>{{ form.isdone_IT14  }}</th>
            <th><button class="btn btn-success" type="submit">Save</button> </th>
            </form>
    {% endfor %}
</table>

    {% endif %}
</body>
{% endblock %}
</html>

Вы, очевидно, пытаетесь save сохранить форму с None в качестве значения FinancialYearEnd, которая получила null=False, поэтому это запрещено. Если форма пытается сохранить объект со значением только isdone_IT14, она может дать None всем остальным и должна выдать эту ошибку.

Думаю, вы можете попробовать пока перейти на null=True и посмотреть, что на самом деле меняет форма в объектах.

Вернуться на верх