【问题标题】:How to make a 404 page for a single view?如何为单个视图制作 404 页面?
【发布时间】:2019-10-23 02:28:41
【问题描述】:

如果我将 URL 设置为显示 404 页面,我需要一个基于函数的视图。

我知道它可以在 settings.py 中使用 DEBUG = True 进行设置,但这样做我遇到了严重的问题。

现在我只能让这个页面使用 Http404 吗?

url.py

url(r'^reporte_servicio_externo/(?P<pk>[\w{}.-]{20})/$', 'apps.servicios.views.reporte_servicio_externo',
      name='reporte_servicio_externo')

view.py

def reporte_servicio_externo(request, pk):
    anuncio = Anuncio.objects.get(pk=get_unhash(pk))
    anuncioproyectos = AnuncioProyectos.objects.filter(anuncio=anuncio)
    cadena_tipo_carga = []
    cadena_actividad = []
    cadena_trafico = []
    cadena_escala = []
    cadena_ambito = []
    cadena_articulo = []
    cadena_tipo_producto = []
    cadena_muelles = []

    title_meta = 'Reporte Anuncio'
    title = 'Reporte Anuncio'

    if anuncio.tipo_carga:
        tipo_carga = anuncio.tipo_carga.all()
        for i in tipo_carga:
            cadena_tipo_carga.append(i.nombre)

    if anuncio.amarraderos:
        amarraderos = anuncio.amarraderos.all().values('nombre')
        for item in amarraderos:
            cadena_muelles.append(item['nombre'])

    for item in anuncioproyectos:
        if item.escala:
            cadena_escala.append(item.escala)

        if item.ambito:
            cadena_ambito.append(item.ambito.nombre)

        if item.articulo:
            cadena_articulo.append(item.articulo.nombre)

        if item.tipo_producto:
            cadena_tipo_producto.append(item.tipo_producto.nombre)

        for i in item.actividad.all():
            cadena_actividad.append(i.nombre)

        for i in item.tipo_trafico.all():
            cadena_trafico.append(i.nombre)

    cadena_tipo_carga = ", ".join(list(set(cadena_tipo_carga)))
    cadena_actividad = ", ".join(list(set(cadena_actividad)))
    cadena_trafico = ", ".join(list(set(cadena_trafico)))
    cadena_escala = ", ".join(list(set(cadena_escala)))
    cadena_ambito = ", ".join(list(set(cadena_ambito)))
    cadena_articulo = ", ".join(list(set(cadena_articulo)))
    cadena_tipo_producto = ", ".join(list(set(cadena_tipo_producto)))
    cadena_muelles = ", ".join(list(set(cadena_muelles)))

    return render('externo/ServicioExterno/reporte_servicio_externo.html', locals(), context_instance=ctx(request))

试试这个例子,但没有。但是我错过了一些东西,但我不知道它是什么。

示例 django 文档

from django.http import Http404
from django.shortcuts import render
from polls.models import Poll

def detail(request, poll_id):
    try:
        p = Poll.objects.get(pk=poll_id)
    except Poll.DoesNotExist:
        raise Http404("Poll does not exist")
    return render(request, 'polls/detail.html', {'poll': p})```

【问题讨论】:

  • 这个问题一点都不清楚。你想要404页面在哪里?为什么?投票详细信息视图与什么有什么关系? DEBUG 设置与它有什么关系?
  • 我不明白你的问题。是不是 detail() 视图不符合您的要求?为什么要向我们展示reporte_servicio_externo() 视图?
  • detail 函数是Django文档的一个例子,我的函数是reporte_servicio_externo
  • 好的,但是你想用它做什么?什么不工作?什么应该触发 404?
  • 我的报告工作正常,但现在当用户更改任何人的 url 时,应该留下一个 404 错误页面。我尝试了django提供的文档的例子,但是没有成功。

标签: django python-2.7 django-views


【解决方案1】:

如果我正确理解您的问题,如果他们点击该 URL(以及随后该视图)并且该对象不再存在,您希望显示 404。当然,有办法做到这一点。有一个叫做get_object_or_404 的东西就是这样做的。这就是你使用它的方式

from django.shortcuts import get_object_or_404
anuncio = get_object_or_404(Anuncio, pk=get_unhash(pk))

因此,如果它没有找到具有给定 pkobject,它将抛出 404。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 2022-11-13
    • 2012-02-26
    • 1970-01-01
    • 2010-11-24
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多