微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Django - 处理完整性错误并显示错误弹出

我的model.py文件如下。我创建了一个共轭主键 date & station

Models.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,default = 0)
    exports = models.DecimalField(max_digits= 5,default = 0)

Form.py

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())})
        }

Views.py

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:
    if request.method == 'POST':
        properties_Form = InputForm(request.POST,obj.pk))
except IntegrityError as e:
    error_message = e.__cause__
    print(error_message)

解决方法

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

相反,您只需要在 .is_valid() 返回 False 的情况下返回响应。此外,表单本身会在您呈现时呈现错误以将其显示给用户,因此您应该再次呈现相同的页面:

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))
    context['form'] = properties_Form
    return render(request,"form.html",context) # form was not valid so returning a response here

如果您想自定义生成的错误消息,您可以通过在表单的 error_messages 类上设置 Meta 属性来实现(请参阅 Considerations regarding model’s error_messages [Django docs]):

from django.core.exceptions import NON_FIELD_ERRORS


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())})
        }
        error_messages = {
            NON_FIELD_ERRORS: {
                'unique_together': "%(model_name)s's %(field_labels)s are not unique.",}
        }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。