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

Django技术问题:从View更新值及向DetailView传递ID

Django开发问题解决方案:QuerySet属性访问与ID传递

问题1:QuerySet无法访问实例属性

原因

Graduates.objects.filter(ticket_id=getId)返回的是QuerySet对象(查询集合),不是单个Graduates实例。QuerySet是多个对象的集合,没有attendance、status这类实例属性,直接访问会报错。

解决方案

因为ticket_id是Graduates的主键(primary_key=True),可以用get()方法直接获取单个对象,同时捕获对象不存在的异常:

修改home/views.py中的form_valid方法:

def form_valid(self, form):
    getId = form.cleaned_data['nomor_ticket']
    try:
        # 用get()获取单个实例,主键唯一,确保只会返回一个对象
        graduate = Graduates.objects.get(ticket_id=getId)
    except Graduates.DoesNotExist:
        print('ticket not found')
        # 可选:添加错误提示或重定向到错误页面
    else:
        # 现在可以正常访问实例属性
        print(graduate.attendance == timezone.now())
        print(graduate.status == True)
        print('ticket available')
        # 保存ticket_id,供跳转使用
        self.ticket_id = getId
    return super().form_valid(form)

如果不确定ticket_id是否唯一,也可以用filter(...).first()获取第一个匹配对象:

graduate = Graduates.objects.filter(ticket_id=getId).first()
if graduate:
    # 访问属性逻辑
else:
    # 不存在的逻辑

问题2:传递ticket_id到get_success_url实现跳转

解决方案

在form_valid方法中获取到有效的ticket_id后,将其保存到视图类的实例属性中,然后在get_success_url中使用该值生成跳转URL:

修改home/views.py中的get_success_url方法:

def get_success_url(self):
    # 通过kwargs传递pk参数,因为attendance的URL配置使用<pk>,且Graduates的主键是ticket_id
    return reverse('attendance:index', kwargs={'pk': self.ticket_id})

完整修改后的home/views.py

from django.utils import timezone
from django.urls import reverse
from django.views.generic.edit import FormView
from .forms import TicketForm
from attendance.models import Graduates

class HomeView(FormView):
    template_name = 'home/index.html'
    form_class = TicketForm

    def form_valid(self, form):
        getId = form.cleaned_data['nomor_ticket']
        try:
            graduate = Graduates.objects.get(ticket_id=getId)
        except Graduates.DoesNotExist:
            print('ticket not found')
            # 可选:添加消息提示
            # from django.contrib import messages
            # messages.error(self.request, "Tiket tidak ditemukan")
            return super().form_valid(form)
        else:
            print(graduate.attendance == timezone.now())
            print(graduate.status == True)
            print('ticket available')
            self.ticket_id = getId
        return super().form_valid(form)

    def get_success_url(self):
        # 确保只有找到有效ticket时才跳转,否则重定向回原页面
        if hasattr(self, 'ticket_id'):
            return reverse('attendance:index', kwargs={'pk': self.ticket_id})
        return reverse('home:index')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:45:42