Python Django-处理完整性错误并显示错误弹出窗口

Python Django-处理完整性错误并显示错误弹出窗口,python,django,exception,django-models,data-integrity,Python,Django,Exception,Django Models,Data Integrity,我的model.py文件如下所示。我已经创建了一个共轭主键日期和站 型号.py from django.db import models from django import forms # Create your models here. from django.db import models from django.conf import settings from django.contrib.auth.models import User # Create your models

我的model.py文件如下所示。我已经创建了一个共轭主键
日期

型号.py

from django.db import models
from django import forms
# Create your models here.
from django.db import models
from django.conf import settings
from django.contrib.auth.models import User



# Create your models here.
class ManHour(models.Model):
    class Meta:
        unique_together = (('date', 'station'),)

    station_choices = (
       ('KHI','Station1'),
       ('ISB', 'Station2'),
       ('LHE','Station3'),
       )

    station = models.CharField(
        max_length=3,
        choices=station_choices,
    )
    date = models.DateField()
    date_time  = models.DateTimeField(auto_now=True)
    imports_airside = models.DecimalField(max_digits= 5, decimal_places= 3, default = 0)
    imports_landside = models.DecimalField(max_digits= 5, decimal_places= 3, default = 0)
    exports = models.DecimalField(max_digits= 5, decimal_places= 3, default = 0)
from django import forms
from manhourapp.models import ManHour
from datetime import date

class DateInput(forms.DateInput):
    input_type = 'date'

class InputForm(forms.ModelForm):
    class Meta:
        model = ManHour
        fields = ['date','station', 'imports_airside', 'imports_landside', 'exports']
        widgets = {
            'date':forms.widgets.DateInput(attrs={'type': 'date', 'max':str(date.today())})
        }
def form_page(request):
    context = {}

    try:
        man_hour = ManHour.objects.get(pk=request.GET.get("pk"))
    except ManHour.DoesNotExist:
        man_hour = None

    if man_hour:
        context["Total_Imports"] = man_hour.imports_airside + man_hour.imports_landside


    if man_hour:
        context["Total_Hours"] = man_hour.imports_airside + man_hour.imports_landside + man_hour.exports

    if request.method == 'POST':
        properties_Form = InputForm(request.POST, instance=man_hour)
        if properties_Form.is_valid():
            obj = properties_Form.save()
            return redirect("%s?pk=%s" % (reverse('form'), obj.pk))
    else:   
        context['form']= InputForm(instance=man_hour)
        return render(request, "form.html", context)
Form.py

from django.db import models
from django import forms
# Create your models here.
from django.db import models
from django.conf import settings
from django.contrib.auth.models import User



# Create your models here.
class ManHour(models.Model):
    class Meta:
        unique_together = (('date', 'station'),)

    station_choices = (
       ('KHI','Station1'),
       ('ISB', 'Station2'),
       ('LHE','Station3'),
       )

    station = models.CharField(
        max_length=3,
        choices=station_choices,
    )
    date = models.DateField()
    date_time  = models.DateTimeField(auto_now=True)
    imports_airside = models.DecimalField(max_digits= 5, decimal_places= 3, default = 0)
    imports_landside = models.DecimalField(max_digits= 5, decimal_places= 3, default = 0)
    exports = models.DecimalField(max_digits= 5, decimal_places= 3, default = 0)
from django import forms
from manhourapp.models import ManHour
from datetime import date

class DateInput(forms.DateInput):
    input_type = 'date'

class InputForm(forms.ModelForm):
    class Meta:
        model = ManHour
        fields = ['date','station', 'imports_airside', 'imports_landside', 'exports']
        widgets = {
            'date':forms.widgets.DateInput(attrs={'type': 'date', 'max':str(date.today())})
        }
def form_page(request):
    context = {}

    try:
        man_hour = ManHour.objects.get(pk=request.GET.get("pk"))
    except ManHour.DoesNotExist:
        man_hour = None

    if man_hour:
        context["Total_Imports"] = man_hour.imports_airside + man_hour.imports_landside


    if man_hour:
        context["Total_Hours"] = man_hour.imports_airside + man_hour.imports_landside + man_hour.exports

    if request.method == 'POST':
        properties_Form = InputForm(request.POST, instance=man_hour)
        if properties_Form.is_valid():
            obj = properties_Form.save()
            return redirect("%s?pk=%s" % (reverse('form'), obj.pk))
    else:   
        context['form']= InputForm(instance=man_hour)
        return render(request, "form.html", context)
视图.py

from django.db import models
from django import forms
# Create your models here.
from django.db import models
from django.conf import settings
from django.contrib.auth.models import User



# Create your models here.
class ManHour(models.Model):
    class Meta:
        unique_together = (('date', 'station'),)

    station_choices = (
       ('KHI','Station1'),
       ('ISB', 'Station2'),
       ('LHE','Station3'),
       )

    station = models.CharField(
        max_length=3,
        choices=station_choices,
    )
    date = models.DateField()
    date_time  = models.DateTimeField(auto_now=True)
    imports_airside = models.DecimalField(max_digits= 5, decimal_places= 3, default = 0)
    imports_landside = models.DecimalField(max_digits= 5, decimal_places= 3, default = 0)
    exports = models.DecimalField(max_digits= 5, decimal_places= 3, default = 0)
from django import forms
from manhourapp.models import ManHour
from datetime import date

class DateInput(forms.DateInput):
    input_type = 'date'

class InputForm(forms.ModelForm):
    class Meta:
        model = ManHour
        fields = ['date','station', 'imports_airside', 'imports_landside', 'exports']
        widgets = {
            'date':forms.widgets.DateInput(attrs={'type': 'date', 'max':str(date.today())})
        }
def form_page(request):
    context = {}

    try:
        man_hour = ManHour.objects.get(pk=request.GET.get("pk"))
    except ManHour.DoesNotExist:
        man_hour = None

    if man_hour:
        context["Total_Imports"] = man_hour.imports_airside + man_hour.imports_landside


    if man_hour:
        context["Total_Hours"] = man_hour.imports_airside + man_hour.imports_landside + man_hour.exports

    if request.method == 'POST':
        properties_Form = InputForm(request.POST, instance=man_hour)
        if properties_Form.is_valid():
            obj = properties_Form.save()
            return redirect("%s?pk=%s" % (reverse('form'), obj.pk))
    else:   
        context['form']= InputForm(instance=man_hour)
        return render(request, "form.html", context)
HTML

<!DOCTYPE html>
<html>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js" async></script>
    </head>
    <body>
      

        <form target="upload_frame" action="." method="post" enctype="multipart/form-data" >
            {% csrf_token %}
            {{ form.as_p }}<br>
            <input type="text" name="Total_Imports" value="{{ Total_Imports }}" class="form-control" disabled><br>
            <input type="text" name="Total_Hours" value="{{ Total_Hours }}" class="form-control" disabled><br>
            <input type="submit" name="submit" value="Upload" id="submit">
            <div class="user_panel">
                <a href="/logout">logout</a>
            </div>
        </form>           
    </body>
</html>

Django中的
表单
类将为您执行验证和清理。它不会引发错误,但会自己捕获错误,因此使用try-except没有多大意义,因为表单本身已经捕获了错误

相反,您只需要在case
中返回一个响应。is\u valid()
返回
False
。此外,表单本身将呈现错误,以便在呈现时将其显示给用户,因此您只需再次呈现相同的页面:

if request.method==“POST”:
属性\表单=输入表单(request.POST,实例=工时)
如果属性\u Form.is\u valid():
obj=属性\u Form.save()
返回重定向(“%s?pk=%s”%(反向('form'),obj.pk))
上下文['form']=properties\u form
return render(请求“form.html”,上下文)#表单无效,因此在此处返回响应
如果要自定义生成的错误消息,可以通过在表单的
Meta
类上设置
error\u messages
属性来实现(请参阅):

从django.core.exceptions导入非\u字段\u错误
类InputForm(forms.ModelForm):
类元:
型号=工时
字段=['date'、'station'、'imports\u airside'、'imports\u landside'、'exports']
小部件={
'date':forms.widgets.DateInput(attrs={'type':'date','max':str(date.today())})
}
错误消息={
非字段错误:{
“一起唯一”:“%(型号名称)的%(字段标签)不是唯一的。”,
}
}

表单本身是否应该处理该错误?该错误应与表单一起呈现。。。此外,如果表单无效,您似乎不会返回任何响应…@AbdulAzizBarkat我将
打印(错误消息)
替换为
返回HttpResponse(错误消息)
views.py
文件的异常处理中,但我仍然收到一个错误
view pages.views.form\u页面没有返回HttpResponse对象
现在我可以看到响应了。然而,我对这个错误消息是如何产生的感到困惑?如果我需要自定义此错误消息及其表示方式,我如何才能做到?@Lopez表单将按照我前面所述执行验证和清理。如果您想查看如何自定义错误消息,请检查我的编辑。谢谢您的输入。你们能不能提供一个链接或想法,说明在主键存在的情况下,我如何向用户提供编辑记录的功能?@Lopez你们不是已经在这样做了吗?您通过
instance=man_hour
从而更新通过的实例。无论如何,请查看并尝试使用
UpdateView
。谢谢,我会尝试的。但是,不会按照当前方法替换实例。