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
相关产品推荐
相关产品推荐

