如何在Django中显示自定义错误页面

编码员

我在应用程序中有一个表列表,如果用户预订了一个可用的表,它将正确无误地预订它,但是如果用户预订了一个不可用的表,它将显示一个错误页面,提示“不存在匹配查询的表”。我一直在尝试一些方法来获取自定义错误页面或一些更好的界面,而不是页面错误。

错误日志

Environment:


Request Method: POST
Request URL: http://localhost:8000/reserve/1/

Django Version: 3.1.4
Python Version: 3.7.3
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'core',
 'dashboard',
 'widget_tweaks',
 'phonenumber_field']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "C:\Users\Habib\Documents\django\FIVERR\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\Habib\Documents\django\FIVERR\venv\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Habib\Documents\django\FIVERR\adam_mailk\core\views.py", line 30, in ReserveTable
    table_exists = Tables.objects.get(table_no=request.POST['table'], bar=bar)
  File "C:\Users\Habib\Documents\django\FIVERR\venv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\Habib\Documents\django\FIVERR\venv\lib\site-packages\django\db\models\query.py", line 431, in get
    self.model._meta.object_name

Exception Type: DoesNotExist at /reserve/1/
Exception Value: Tables matching query does not exist.

这是它显示的错误页面的可视图像

views.py

def ReserveTable(request, pk):

    bar = Bar.objects.get(id=pk)
    tables = Tables.objects.filter(bar=bar, status="available")
    form = ReservationForm()
    if request.method == "POST":
        if request.POST['table']:
            request.POST = request.POST.copy()
            table_exists = Tables.objects.get(table_no=request.POST['table'], bar=bar)

            if table_exists.DoesNotExist:
                return redirect(reverse('error-page', kwargs={'message': "This object does not exist"}))

            request.POST['people'] = table_exists.seats
            form = request.POST
            try:
                if table_exists.status == "available":
                    time = form['time']
                    people = form['people']
                    comment = form['comment']
                    date_reserved = form['date_reserved']

                    resrv = Reservation.objects.create(time=time, date_reserved=date_reserved, comment=comment, table=table_exists)
                    resrv.save()
                    table_exists.status = "unavailable"
                    table_exists.save()
                    messages.success(request, "you have successfully booked a new table")
                    return redirect(request.path)
                else:
                    recommend = Tables.objects.filter(seats=table_exists.seats, status="available")
                    messages.error(request, "Unable to book a new table. Table Not available.")
                    request.session['recommend'] = list(recommend)
                    return redirect(request.path)

            except Exception as e:
                messages.error(request, "Unknown error")
                return redirect(request.path)

    context = {"bar":bar, "form":form, "tables": tables}
    return render(request, "website/reservation.html", context)

def error_page(request, message):
    return render(request, 'website/error_page.html', {'message': message})

models.py

class Bar(models.Model):

    status = (
            ("open", "open"),
            ("closed", "closed"),
            ("pending", "pending"),
        )

    user_id = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=100)
    opening_time = models.TimeField()
    closing_time = models.TimeField()
    status = models.CharField(choices=status, default="pending", max_length=14)
    image = models.ImageField(upload_to='images/bars', default='images/bars/default.jpg')

    def __str__(self):
        return self.name

class Tables(models.Model):

    status = (
            ("available", "available"),
            ("unavailable", "unavailable"),
        )

    table_no = models.CharField(max_length=14, unique=False)
    status = models.CharField(choices=status, default="unavailable", max_length=14)
    seats = models.IntegerField()
    bar = models.ForeignKey(to=Bar, on_delete=models.CASCADE)

    def __str__(self):
        return self.table_no


class Reservation(models.Model):

    status_choices = (
        ("pending", "pending"), 
        ("confirmed", "confirmed")
    )

    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)
    email = models.EmailField()
    phone = PhoneNumberField(blank=True)
    people = models.IntegerField(default=1)
    time = models.TimeField()
    date_reserved = models.DateField()
    date_booked = models.DateTimeField(auto_now_add=True)
    status = models.CharField(max_length=10, choices=status_choices, default="confirmed")
    comment = models.TextField(blank=True)
    table = models.ForeignKey(Tables, on_delete=models.CASCADE)

    def __str__(self):
        return self.first_name
电磁场

•创建一个接受消息的视图:

def error_page(request, message):
    return render(request, 'error_page.html', {'message': message})

•创建模板:

{% extends 'base.html' %}
{% block content %}

{{ message }}

{% endblock %}

•当代码中发生错误时,只需使用以下消息将重定向到此视图:

if object.DoesNotExist:
    return redirect(reverse('error_page', 
                            kwargs={'message': "This object does not exist ( or something )"})

更新

您也可以将函数包装在try->除了这样的块中:

def ReserveTable(request, pk):
    try:
        bar = Bar.objects.get(id=pk)
        tables = Tables.objects.filter(bar=bar, status="available")
        form = ReservationForm()
        if request.method == "POST":
            if request.POST['table']:
                request.POST = request.POST.copy()
                table_exists = Tables.objects.get(table_no=request.POST['table'], bar=bar)

                 if table_exists.DoesNotExist:
                    return redirect(reverse('error-page', kwargs={'message': "This object does not exist"}))

                request.POST['people'] = table_exists.seats
                form = request.POST
                try:
                    if table_exists.status == "available":
                        time = form['time']
                        people = form['people']
                        comment = form['comment']
                        date_reserved = form['date_reserved']

                        resrv = Reservation.objects.create(time=time, date_reserved=date_reserved, comment=comment, table=table_exists)
                        resrv.save()
                        table_exists.status = "unavailable"
                        table_exists.save()
                        messages.success(request, "you have successfully booked a new table")
                        return redirect(request.path)
                    else:
                        recommend = Tables.objects.filter(seats=table_exists.seats, status="available")
                        messages.error(request, "Unable to book a new table. Table Not available.")
                        request.session['recommend'] = list(recommend)
                        return redirect(request.path)

    except Exception as ex:
        return redirect(reverse('error_page', kwargs={'message': ex})

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Django中显示自定义错误?

如何在.net Core 3.0中显示400错误的自定义页面

如何在php中显示子文件夹的自定义404错误页面?

如何在Django中的自定义注册模板中显示错误消息

如何在Yii中自定义错误显示消息?

如何在DropzoneJS中显示自定义错误消息?

如何在环回中定义自定义错误页面?

在404错误自定义页面中显示失败链接

如何在结帐页面显示自定义运费

Django 1.5中的自定义404错误页面

Django Rest框架中的自定义403错误页面

在 Django 中设置 http 错误自定义页面

Inno Setup:如何在过程InitializeWizard()中显示自定义页面之前如何显示许可证页面;

如何在WordPress的自定义页面模板中显示帖子?

如何在自定义页面上的购物车中显示产品数量

如何在自定义菜单模板中显示“选定页面”?

如何在woocommerce的自定义类别页面中显示产品描述

如何在 Woo Commerce 订单编辑页面中显示结帐自定义字段值?

如何在角度4中显示来自自定义验证器功能的自定义错误消息?

如何在 Webview Flutter 中制作自定义错误页面

如何在Django CRUD中自定义auth.User Admin页面?

如何在 SvelteKit 中添加自定义 404 页面和不同的错误页面(针对其他错误)?

在模板中显示自定义Django表单错误

如何在ActiveAdmin gem中创建自定义页面

如何在JavaDoc中自定义“概述”页面?

如何在Magento中添加自定义PHP页面?

如何在QWebEngineView或页面中嵌入自定义QWidget?

如何在Wordpress中制作自定义页面

如何在 REST API 中显示自定义错误响应