【问题标题】:Django error stating model field not definedDjango 错误说明模型字段未定义
【发布时间】:2020-05-05 16:13:14
【问题描述】:

所以我正在尝试创建一个 django 视图,其中根据当前登录用户的过去月数进行检索,由他/她在无线电选项中选择。但我面临一个错误,指出我的模型字段之一“时间戳”未定义。另外,我对如何在 html 中打印检索到的模型有点困惑。以下是我的文件:

html:

{% if model %}
    <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 i in model %}
            <tr>
                <td style="text-align: center;">{{ i.vendor_id }}</td>
                <td style="text-align: center;">{{ i.emp_id }}</td>
                <td style="text-align: center;">{{ i.debit }}</td>
                <td style="text-align: center;">{{ i.credit }}</td>
                <td style="text-align: center;">{{ i.timestamp }}</td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
    {% else %}
        <p>There are no active transactions!</p>
    {% endif %}

Views.py

if 'form2' in request.POST:
            d = {}
            date_id = request.POST["groupOfDefaultRadios1"]
            x = employee.objects.get(name = request.user)
            if date_id == 1:
                d = transaction.objects.filter(emp_id = x, timestamp = datetime.date.today-timestamp(days=30))
            elif date_id == 2:
                d = transaction.objects.filter(emp_id = x, timestamp = datetime.date.today-timestamp(days=60))
            else:
                d = transaction.objects.filter(emp_id = x, timestamp = datetime.date.today-timestamp(days=180))
                print(d)

            return render(request, 'profiles/userLogin.html', {'model':d})  

models.py:

class vendor(models.Model):
    id = models.CharField(max_length=20, primary_key=True)
    name = models.CharField(max_length=30)

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)

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=datetime.date.today)

感谢任何帮助。

【问题讨论】:

    标签: html django django-models django-views


    【解决方案1】:

    首先,当 Django 引发未定义的错误时,您确定您已将迁移应用到此应用程序吗?

    python manage.py makemigrations APP_NAME
    python manage.py sqlmigrate APP_NAME 0001
    python manage.py migrate
    

    接下来,在您的模型文件中:

    timestamp = models.DateField(("Date"), default=datetime.date.today)
    

    当我查找 Django 的模型字段引用时,我发现了这个:

    class DateField(auto_now=False, auto_now_add=False, **options)
    

    在审视您的需求后,将auto_now_add 切换为True 会有所帮助吗?我怀疑default= 在任何情况下都可以使用。 https://docs.djangoproject.com/en/3.0/ref/models/fields/#datefield

    附带说明,当您在管理仪表板中创建对象时,有时 Django 会错误检查字段要求(例如创建超级用户),因此请注意管理站点中的这些对象。

    【讨论】:

      【解决方案2】:

      如果我没听错的话,如果他们的 timestamp 日期距离今天不到 30、60、180 天,您想要过滤 transaction

      那么你的过滤器应该是这样的

      d = transaction.objects.filter(emp_id = x, timestamp__gte = datetime.date.today() - datetime.timedelta(days=30))

      e.t.c

      p.s.:避免使用您使用的库中使用的名称命名模型字段,例如 timestamp

      【讨论】:

      • 谢谢。这解决了我在views.py 上的问题。顺便说一句,我们为什么要避免使用我们使用的库中使用的名称来命名模型字段?如果我没有指定字段,timestamp_gte 如何与模型匹配?
      • 尝试搜索您的问题的答案,如果失败,制定并创建新问题。 P.s.:查看您的模型的__str__(self): 函数方向或在您的html中尝试i.vendor_id.id
      • 你编辑了你的评论,所以我的评论现在变得不相关了。关于命名避免。您在模型字段中遇到了该问题的错误,因为您的模型字段名为timestamp,但问题是您调用timestamp 而不是datetime.datetime.timestamp,试图过滤日期。由于此字段名称,您收到了一条令人困惑的错误消息。
      • 现在知道了。很抱歉编辑我的评论,我在阅读您的评论之前找到了解决方案:D
      猜你喜欢
      • 2012-12-14
      • 1970-01-01
      • 2012-01-06
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      相关资源
      最近更新 更多