如何在Django Admin中按参数获取指定模型的变更列表子集
Django 数据过滤解决方案
问题1:仅展示指定水源点的化学数据记录
首先确认Dquimicos模型已关联Pagua外键,示例模型定义:
# models.py class Dquimicos(models.Model): agua = models.ForeignKey(Pagua, on_delete=models.CASCADE, related_name='chemical_records') # 其他化学数据字段(如pH值、污染物含量等)
自定义类视图实现
基于ListView改造,从URL路径获取水源点ID并过滤:
# views.py from django.views.generic import ListView from .models import Dquimicos class VerdQuimicosListView(ListView): model = Dquimicos template_name = 'chemical_records.html' # 替换为你的模板路径 def get_queryset(self): # 从URL路径参数获取水源点ID agua_id = self.kwargs.get('agua_id') queryset = super().get_queryset() if agua_id: # 过滤出对应水源点的化学数据 queryset = queryset.filter(agua_id=agua_id) return queryset
对应的URL配置:
# urls.py from django.urls import path from . import views urlpatterns = [ path('chemical/<int:agua_id>/', VerdQuimicosListView.as_view(), name='verdquimicos'), # 其他URL规则 ]
自定义函数视图实现
如果是函数式视图,直接过滤查询集:
# views.py from django.shortcuts import render from .models import Dquimicos def verdquimicos(request, agua_id): chemical_records = Dquimicos.objects.filter(agua_id=agua_id) return render(request, 'chemical_records.html', {'records': chemical_records})
问题2:仅展示指定ID的水源点记录
自定义类视图实现
如果是基于ListView的水源点列表,仅返回指定ID的记录:
# views.py from django.views.generic import ListView from .models import Pagua class VerPaguaListView(ListView): model = Pagua template_name = 'water_source.html' def get_queryset(self): agua_id = self.kwargs.get('agua_id') queryset = super().get_queryset() if agua_id: # 仅保留指定ID的水源点(含继承的Pasup记录) queryset = queryset.filter(id=agua_id) return queryset
如果需要单独展示地表水点(Pasup),可修改过滤条件:
queryset = Pasup.objects.filter(id=agua_id)
函数视图实现
直接获取指定ID的水源点,若不存在返回404:
# views.py from django.shortcuts import render, get_object_or_404 from .models import Pagua def verpagua(request, agua_id): water_source = get_object_or_404(Pagua, id=agua_id) # 若需展示修改页面,建议使用UpdateView return render(request, 'water_source_edit.html', {'source': water_source})
Django Admin 过滤配置
如果是在Admin后台的变更列表中过滤,重写Admin类的get_queryset方法:
# admin.py from django.contrib import admin from .models import Pagua, Dquimicos class PaguaAdmin(admin.ModelAdmin): def get_queryset(self, request): queryset = super().get_queryset(request) # 从GET参数获取水源点ID,如 /admin/yourapp/pagua/?agua_id=1 agua_id = request.GET.get('agua_id') if agua_id: queryset = queryset.filter(id=agua_id) return queryset class DquimicosAdmin(admin.ModelAdmin): def get_queryset(self, request): queryset = super().get_queryset(request) agua_id = request.GET.get('agua_id') if agua_id: queryset = queryset.filter(agua_id=agua_id) return queryset admin.site.register(Pagua, PaguaAdmin) admin.site.register(Dquimicos, DquimicosAdmin)
关键注意事项
- 确保URL配置正确传递
agua_id参数,优先使用路径参数(更符合REST规范) - 类视图中通过
self.kwargs获取路径参数,self.request.GET获取URL查询参数 - 若模型关联字段名不是
agua或agua_id,需替换为实际字段名 - 多表继承的Pasup会被包含在Pagua的查询集中,如需单独过滤需直接查询Pasup模型
内容的提问来源于stack exchange,提问作者wrcarrizo
相关产品推荐
相关产品推荐

