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

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是有效的transaction QuerySet(上面修正后的代码已经保证了这一点)
  • 空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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:19:06