You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django壁纸网站两类报错排查:分页警告与Wallpaper不存在异常

Django壁纸网站问题解决方案

问题概述

运行Django壁纸网站时遇到两个问题:

  • 触发UnorderedObjectListWarning,提示无序的Wallpaper QuerySet分页可能导致结果不一致;
  • 访问/favicon.ico/时触发500错误,报错Wallpaper.models.Wallpaper.DoesNotExist,原因是download视图通过wallpaper_name获取实例失败。

原视图代码(Views.py)

def home(request):
    WAllPAPER_PER_PAGE = 4
    WALL = Wallpaper.objects.all()
    from django.core.paginator import EmptyPage, Paginator
    from django.db.models import Q
    qd = request.GET.copy()
    qd.pop('page', None)
    querystring = qd.urlencode()
    #link formatting for ordering
    ordering =request.GET.get('ordering', "")
    #link formatting for sorting
    search = request.GET.get('search', "")
    if search:
        wallpapers = Wallpaper.objects.filter(Q(name__icontains=search) | Q(category__category_name__icontains=search) | Q(tags__tag__icontains=search)).distinct()
        WALL = None
    else:
        wallpapers = Wallpaper.objects.all()
    if ordering:
        wallpapers = wallpapers.order_by(ordering)
    page = request.GET.get('page', 1)
    wallpaper_paginator = Paginator(wallpapers, WAllPAPER_PER_PAGE)
    try:
        wallpapers = wallpaper_paginator.page(page)
    except EmptyPage:
        wallpapers = wallpaper_paginator.page(wallpaper_paginator.num_pages)
    except:
        wallpapers = wallpaper_paginator.page(WAllPAPER_PER_PAGE)
    context = {'querystring': querystring, "wallpapers": wallpapers, 'page_obj': wallpapers, 'is_paginated': True, 'paginator': wallpaper_paginator, 'WALL': WALL}
    return render(request, "Wallpaper/Home.html", context)


def All_category(request):
    Cat = Category.objects.all()
    context = {'Cat': Cat }
    return render(request, "Wallpaper/ALL_Category.html", context )


def category(request, Category_name):
    cat = Category.objects.get(category_name=Category_name)
    wallpapers = Wallpaper.objects.filter(category__category_name=Category_name)
    context = {'cat':cat, 'wallpapers': wallpapers}
    return render(request,'Wallpaper/Category.html', context)


def download(request, wallpaper_name):
    wallpaper = Wallpaper.objects.get(name=wallpaper_name)
    similar_wallpapers = wallpaper.tags.similar_objects()
    context = {'wallpaper': wallpaper, 'similar_wallpapers': similar_wallpapers}
    return render(request, 'Wallpaper/download.html', context)

错误日志

C:\Users\Atharva thaware\Desktop\aman\projects\Ongoing\WallpaperTown\WallpaperTown\Wallpaper\views.py:30: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'Wallpaper.models. Wallpaper'> QuerySet.   wallpaper_paginator = Paginator(wallpapers, WAllPAPER_PER_PAGE) 
[19/Jul/2022 22:29:39] "GET / HTTP/1.1" 200 10744 
[19/Jul/2022 22:29:39] "GET /media/Wallpaper/Images/wp4589844-inosuke-hashibira-wallpapers.jpg HTTP/1.1" 304 0 
[19/Jul/2022 22:29:39] "GET /media/Wallpaper/Images/wp2162463-shoto-todoroki-wallpapers.png HTTP/1.1" 304 0 
[19/Jul/2022 22:29:39] "GET /media/Wallpaper/Images/wp2490700-haikyu-2018-wallpapers.jpg HTTP/1.1" 304 0 
[19/Jul/2022 22:29:39] "GET /media/Wallpaper/Images/wp1850905-laferrari-wallpapers.jpg HTTP/1.1" 304 0 
Not Found: /docs/5.1/assets/brand/bootstrap-logo.svg 
[19/Jul/2022 22:29:39] "GET /docs/5.1/assets/brand/bootstrap-logo.svg HTTP/1.1" 404 3058 
Internal Server Error: /favicon.ico/ 
Traceback (most recent call last):   
File "C:\Users\Atharva thaware\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)   
File "C:\Users\Atharva thaware\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)   
File "C:\Users\Atharva thaware\Desktop\aman\projects\Ongoing\WallpaperTown\WallpaperTown\Wallpaper\views.py", line 55, in download
    wallpaper = Wallpaper.objects.get(name=wallpaper_name)   
File "C:\Users\Atharva thaware\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)   
File "C:\Users\Atharva thaware\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)   
File "C:\Users\Atharva thaware\Desktop\aman\projects\Ongoing\WallpaperTown\WallpaperTown\Wallpaper\views.py", line 55, in download
    wallpaper = Wallpaper.objects.get(name=wallpaper_name)   
File "C:\Users\Atharva thaware\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)   
File "C:\Users\Atharva thaware\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\query.py", line 435, in get
    raise self.model.DoesNotExist( Wallpaper.models.Wallpaper.DoesNotExist: Wallpaper matching query does not exist. 
[19/Jul/2022 22:29:42] "GET /favicon.ico/ HTTP/1.1" 500 73315

解决方案

1. 解决UnorderedObjectListWarning警告

原因:分页时QuerySet没有明确排序规则,数据库返回的结果顺序不稳定,导致每页内容可能出现重复或遗漏。当前代码中,当没有搜索关键词且未指定排序参数时,wallpapers是未排序的Wallpaper.objects.all()。

修改方案:给QuerySet设置默认排序,比如按主键id或创建时间排序,确保分页结果稳定。同时修复except分支的页码错误(原代码用每页数量当页码,应该改为第1页)。

修改后的home视图代码:

def home(request):
    WAllPAPER_PER_PAGE = 4
    WALL = Wallpaper.objects.all()
    from django.core.paginator import EmptyPage, Paginator
    from django.db.models import Q
    qd = request.GET.copy()
    qd.pop('page', None)
    querystring = qd.urlencode()
    ordering = request.GET.get('ordering', "")
    search = request.GET.get('search', "")
    
    if search:
        wallpapers = Wallpaper.objects.filter(Q(name__icontains=search) | Q(category__category_name__icontains=search) | Q(tags__tag__icontains=search)).distinct()
        WALL = None
    else:
        # 添加默认排序,这里用id升序,也可以换成created_at等自定义字段
        wallpapers = Wallpaper.objects.all().order_by('id')
    
    if ordering:
        wallpapers = wallpapers.order_by(ordering)
    
    page = request.GET.get('page', 1)
    wallpaper_paginator = Paginator(wallpapers, WAllPAPER_PER_PAGE)
    
    try:
        wallpapers = wallpaper_paginator.page(page)
    except EmptyPage:
        wallpapers = wallpaper_paginator.page(wallpaper_paginator.num_pages)
    except:
        # 异常时返回第1页,而不是用每页数量当页码
        wallpapers = wallpaper_paginator.page(1)
    
    context = {'querystring': querystring, "wallpapers": wallpapers, 'page_obj': wallpapers, 'is_paginated': True, 'paginator': wallpaper_paginator, 'WALL': WALL}
    return render(request, "Wallpaper/Home.html", context)

2. 解决/favicon.ico/触发的500错误

原因:Django路由把/favicon.ico/匹配到了download视图的URL规则(比如path('<str:wallpaper_name>/', download)),导致wallpaper_name被设为favicon.ico,但数据库中没有这个名称的壁纸,get()方法抛出异常引发500错误。

推荐两种方案结合使用:

方案一:添加favicon.ico专属路由

在项目的urls.py最前面添加路由,优先处理favicon.ico请求,返回静态图标文件:

from django.views.generic.base import RedirectView

urlpatterns = [
    # 放在所有路由最前面,确保优先匹配
    path('favicon.ico', RedirectView.as_view(url='/static/favicon.ico', permanent=True)),
    # 其他路由...
    path('<str:wallpaper_name>/', download, name='download'),
]

然后将favicon.ico文件放到项目的static目录下,这样浏览器请求图标时会直接获取静态文件,不会走到download视图。

方案二:增强download视图的鲁棒性

用get_object_or_404替代get(),当找不到对应壁纸时自动返回404错误,避免500服务器崩溃:

from django.shortcuts import get_object_or_404

def download(request, wallpaper_name):
    # 找不到时返回404,而不是抛出异常
    wallpaper = get_object_or_404(Wallpaper, name=wallpaper_name)
    similar_wallpapers = wallpaper.tags.similar_objects()
    context = {'wallpaper': wallpaper, 'similar_wallpapers': similar_wallpapers}
    return render(request, 'Wallpaper/download.html', context)

内容的提问来源于stack exchange,提问作者Mario_z04

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:45:42