Попытка поместить данные из базы данных на приборную панель в Django
Итак, я следую этому руководству: https://www.youtube.com/watch?v=_sWgionzDoM и на данный момент нахожусь примерно на 55 минуте
У меня все работает, однако я не могу заставить приборную панель показывать мои данные из базы данных. Таблица отображается на странице администратора с данными, но когда я перехожу на панель пользователя, она не отображается.
Вот код моей приборной панели.
{% extends 'page.html' %}
{% block content %}
{% if messages %}
<div class="row mt-3">
{% for message in messages %}
{% if message.tags == 'error' %}
<div class="col-md-10 col-12 mx-auto alert alert-danger">
{{ message }}
</div>
{% else %}
<div class="col-md-10 col-12 mx-auto alert alert-success">
{{ message }}
</div>
{% endif %}
{% endfor %}
</div>
{% endif %}
<div class="row">
<div class="col-md-10 col-12 mx-auto mt-5">
<div class="d-flex justify-content-end">
<a href="{% url 'main' %}" class="btn btn-primary">+</a>
</div>
<table class="table table-hover table-striped">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Name</th>
<th scope="col">Qty</th>
<th scope="col">Category</th>
<th scope="col"></th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
{% if items|length == 0 %}
<tr>
<th scope="row">-</th>
<td>no data</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td></td>
</tr>
{% endif %}
{% for item in items %}
<tr>
<th scope="row">{{ item.id }}</th>
<td>{{ item.name }}</td>
{% if item.id in low_inventory_ids %}
<td class="text-danger">{{ item.quantity }}</td>
{% else %}
<td class="text-success">{{ item.quantity }}</td>
{% endif %}
<td>{{ item.category.name }}</td>
<td><a href="{% url 'edit-item' item.id %}" class="btn btn-outline-secondary">Edit</a></td>
<td><a href="{% url 'delete-item' item.id %}" class="btn btn-secondary">Delete</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endblock content %}
Вот код моей модели
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class InventoryItem(models.Model):
name = models.CharField(max_length=200)
quantity = models.IntegerField()
category = models.ForeignKey("Category", on_delete=models.SET_NULL, blank=True, null=True)
date_created = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(User, on_delete=models.CASCADE,)
#related_name='accounts_inventoryitems
def __str__(self):
return self.name
class Category(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = 'categories'
def __str__(self):
return self.name`
и вот мой файл views.py
class Dashboard(View):
def get(self, request):
items = InventoryItem.objects.filter(user=self.request.user.id).order_by('id')
return render(request, 'dashboard.html', {'items': items})
Я действительно не уверен, в какой момент он больше не отправляет данные. Я выполнил отладку, и это показывает, что база данных заполнена правильными значениями.
Надеюсь, вы сможете помочь!
Проблема заключается в вашем queryset.
Линия: filter(user=request.user.id)
фильтрует модель инвентаризации для объекта , но значение, по которому вы фильтруете, является первичным ключом текущего пользователя, а не самим объектом пользователя.
Чтобы исправить это, необходимо изменить значение фильтра на экземпляр пользователя:
InventoryItem.objects.filter(user=request.user)
Альтернативный вариант - фильтровать по user_id
напрямую:
InventoryItem.objects.filter(user_id=request.user.id)