Django Admin页面间无法传递Candidate对象信息的问题求助
Django Admin页面间无法传递Candidate对象信息的问题求助
我明白你的问题啦——现在点击Candidate Admin里的链接跳转到Panelist页面后,完全不知道是从哪个Candidate过来的,没法针对性过滤Panelist列表对吧?咱们一步步来解决这个问题:
第一步:先给Panelist模型添加与Candidate的关联(关键前提)
你当前的panelist模型(注意类名首字母建议大写为Panelist,符合Python规范)和Candidate模型没有任何关联,这样根本没法基于Candidate属性过滤Panelist。所以首先要给Panelist加一个外键字段,关联到Candidate:
class Panelist(models.Model): id = models.CharField(primary_key=True, max_length=7, unique=True) name = models.CharField(max_length=255) # 添加外键关联Candidate,建立两者的关联关系 candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE, related_name="panelists")
别忘了执行数据库迁移命令,让修改生效:
python manage.py makemigrations python manage.py migrate
第二步:修改CandidateAdmin里的跳转链接,携带Candidate ID
现在要把Candidate的ID作为参数拼到跳转链接里,这样Panelist页面就能拿到这个参数了,另外你原来的list_display里少了个逗号,这个小错误也要补上:
from django.contrib import admin from django.utils.html import format_html from .models import Candidate, Panelist class CandidateAdmin(admin.ModelAdmin): list_display = ['id', 'name', 'view_panelist'] # 补上name和view_panelist之间的逗号 model = Candidate def view_panelist(self, obj): # 在链接里拼接candidate_id参数,值为当前Candidate的id return format_html( '<a href="/admin/ttt/panelist/?candidate_id={}" class="default"> View Panelist </a>', obj.id )
第三步:自定义PanelistAdmin,根据传递的Candidate ID过滤列表
接下来要在PanelistAdmin里获取URL里的candidate_id参数,然后过滤查询集,同时可以在页面顶部显示当前关联的Candidate信息:
class PanelistAdmin(admin.ModelAdmin): list_display = ['id', 'name', 'candidate'] # 把关联的Candidate也显示在列表里 model = Panelist def get_queryset(self, request): qs = super().get_queryset(request) # 从请求参数里拿到candidate_id candidate_id = request.GET.get('candidate_id') if candidate_id: # 根据candidate_id过滤出对应Candidate的Panelist qs = qs.filter(candidate_id=candidate_id) return qs def changelist_view(self, request, extra_context=None): extra_context = extra_context or {} candidate_id = request.GET.get('candidate_id') if candidate_id: try: candidate = Candidate.objects.get(id=candidate_id) # 给页面添加额外上下文,用于显示当前关联的Candidate信息 extra_context['current_candidate'] = candidate except Candidate.DoesNotExist: pass return super().changelist_view(request, extra_context=extra_context)
第四步:(可选)自定义Panelist列表页模板,显示关联Candidate信息
如果你想在Panelist列表页顶部明确显示“当前查看的是XX Candidate的Panelist”,可以自定义Admin模板:
- 在你的app下创建
templates/admin/ttt/panelist/change_list.html文件(路径要对应你的app和模型名) - 写入以下内容:
{% extends "admin/change_list.html" %} {% block content_title %} {% if current_candidate %} <h1>Panelists for Candidate: {{ current_candidate.name }} (ID: {{ current_candidate.id }})</h1> {% else %} {{ block.super }} {% endif %} {% endblock %}
这样处理后,点击Candidate Admin里的“View Panelist”链接,跳转到Panelist页面后不仅能自动过滤出该Candidate对应的Panelist,还能清晰看到是从哪个Candidate跳转过来的啦!
备注:内容来源于stack exchange,提问作者aimltools.com
相关产品推荐
相关产品推荐

