Django视图开发报错:'timestamp'字段未定义及前端渲染疑问
解决Django视图中的日期过滤错误与数据渲染问题
咱们来逐个解决你遇到的问题:
1. 修复'timestamp'未定义的错误
你碰到的NameError: name 'timestamp' is not defined是由几个关键错误导致的:
错误原因拆解:
- 混淆了Python的
timedelta(用于计算日期差)和模型里的timestamp字段名 datetime.date.today是方法,必须加括号调用:datetime.date.today()- POST获取的
date_id是字符串类型,你用date_id == 1(整数比较)永远不会匹配,得用字符串对比 - 日期过滤逻辑错误:
timestamp = ...只会匹配等于某一天的交易,而我们需要的是过去N天内的所有交易,应该用timestamp__gte(大于等于起始日期)
修正后的Views代码:
先确保导入必需的模块:
from datetime import date, timedelta from django.shortcuts import render from .models import employee, transaction
再修改视图逻辑:
if 'form2' in request.POST: # 用get方法避免KeyError,更安全 date_id = request.POST.get("groupOfDefaultRadios1") try: x = employee.objects.get(name=request.user) except employee.DoesNotExist: # 处理用户不存在的异常,返回提示 return render(request, 'profiles/userLogin.html', {'model': None, 'error': 'Employee profile not found'}) # 根据单选框选项计算起始日期 if date_id == '1': start_date = date.today() - timedelta(days=30) elif date_id == '2': start_date = date.today() - timedelta(days=60) else: start_date = date.today() - timedelta(days=180) # 过滤过去N天内的交易,__gte表示大于等于起始日期 transactions = transaction.objects.filter(emp_id=x, timestamp__gte=start_date) print(transactions) return render(request, 'profiles/userLogin.html', {'model': transactions})
2. HTML渲染模型数据的优化
你的HTML模板代码已经具备渲染能力,但有几个细节可以优化:
现有代码的注意点:
- 确保传递到模板的
model是有效的transactionQuerySet(上面修正后的代码已经保证了这一点) - 空QuerySet在Django模板中会被视为
False,所以{% if model %}能正确显示提示文本,但更严谨的写法是用{% if model.exists %},因为空QuerySet本身是一个对象,只是没有数据
优化后的HTML模板:
{% if model.exists %} <table> <thead> <tr> <th style="padding: 20px;">Vendor ID</th> <th style="padding: 20px;">Employee ID</th> <th style="padding: 20px;">Debit</th> <th style="padding: 20px;">Credit</th> <th style="padding: 20px;">Time of transaction</th> </tr> </thead> <tbody> {% for trans in model %} <tr> <!-- 注意:vendor_id是外键,要显示ID需加.id;如果vendor模型的__str__返回id,原写法也可 --> <td style="text-align: center;">{{ trans.vendor_id.id }}</td> <td style="text-align: center;">{{ trans.emp_id.id }}</td> <td style="text-align: center;">{{ trans.debit }}</td> <td style="text-align: center;">{{ trans.credit }}</td> <td style="text-align: center;">{{ trans.timestamp }}</td> </tr> {% endfor %} </tbody> </table> {% else %} <p>There are no active transactions!</p> {% endif %}
额外建议:为模型添加__str__方法
方便调试和模板显示,给每个模型定义__str__方法:
class vendor(models.Model): id = models.CharField(max_length=20, primary_key=True) name = models.CharField(max_length=30) def __str__(self): return self.id # 也可以返回self.name,按需选择 class employee(models.Model): name = models.OneToOneField(User, on_delete=models.CASCADE) id = models.CharField(max_length=20, primary_key=True) balance = models.IntegerField(default=0) def __str__(self): return self.id class transaction(models.Model): vendor_id = models.ForeignKey(vendor, on_delete=models.CASCADE) emp_id = models.ForeignKey(employee, on_delete=models.CASCADE) debit = models.IntegerField() credit = models.IntegerField() timestamp = models.DateField("Date", default=date.today) def __str__(self): return f"Transaction {self.id} - {self.timestamp}"
内容的提问来源于stack exchange,提问作者DHRUV KAUSHAL
相关产品推荐
相关产品推荐

