Задача: Как динамически создать поле с именем status для отображения на стороне конечного пользователя с помощью django?
Я работаю над персональной веб-страницей, которая в идеале должна сообщать мне о состоянии моих продуктов, например: просроченные и непросроченные, на основе некоторых данных, таких как дата покупки и срок годности, напечатанный на продуктах. Я новичок в фреймворке django, но я много узнаю в Интернете и использую chatgpt, youtube и читаю статьи, чтобы объяснить некоторые концепции и как их использовать.
В настоящее время я застрял на том, почему код, который динамически генерирует поле статуса в функции get_context_data(), в данный момент работает, но я не понимаю, почему он работает, так как это было предложение chatgpt. Я не понимаю, почему я должен писать context['allproducts'] = productStatus вместо того, чтобы просто создать context['status'] = productStatus, а затем вызвать status в переменной для всех элементов в модели Products. Тип данных для productStatus - Queryset, но он ведет себя как словарь, когда я использую операцию присваивания для product.status. Если бы вы могли объяснить, почему это на самом деле работает, было бы замечательно, поскольку для меня не очевидно, как productStatus получает этот столбец product.status.
Является ли это лучшей практикой по динамическому добавлению полей или мне следует использовать другой подход, который может быть более понятным. Чат предлагает мне использовать функцию annotate в get_queryset(), также предлагается добавить непосредственно в модель с помощью оператора @property, а затем определить функцию. Я хотел бы знать, почему тот или иной подход будет лучше, помня о том, что я хочу выпустить веб-страницу, чтобы ее мог использовать любой желающий, поэтому решение должно быть масштабируемым.
Код модели:
class Products(models.Model):
name = models.CharField(max_length=255, unique=True)
description = models.TextField(max_length=255,blank=True)
boughtDate = models.DateField(verbose_name='Bought Date')
expDate = models.DateField(verbose_name='Expired Date')
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "Products"
Код URL:
from . import views
urlpatterns = [
# View Info
path('all', views.ViewProducts.as_view(), name='allproducts'),
Просмотр кода:
class ViewProducts(LoginRequiredMixin,ListView):
login_url = "login"
model = Products
context_object_name = 'allproducts'
template_name = 'all_products.html'
paginate_by = 5
def get_queryset(self):
queryset = Products.objects.all()
return queryset
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
#Fetch all products
productStatus = self.get_queryset()
print(type(productStatus))
# Check expiration status for each product
for product in productStatus:
product.status = 'Unexpired' if product.expDate > date.today() else 'Expired'
context['allproducts'] = productStatus
return context
Код шаблона:
{% extends 'base.html' %}
{% block content %}
<h1>
This is a list of all available products
</h1>
<table border='1'>
<tr>
<th>Product Name</th>
<th>Bought Date</th>
<th>Expire Date</th>
<th>Status</th>
</tr>
{% for x in allproducts %}
<tr>
<td>
<a href="{% url 'detail' x.id %}">
{{ x.name }}
</a>
</td>
<td>
{{ x.boughtDate}}
</td>
<td>
{{ x.expDate }}
</td>
<td>
{{ x.status }}
</td>
</tr>
{% endfor %}
</table>
{% endblock content %}
Изображение текущего дисплея: введите описание изображения здесь