Использование списка Len Of A List для создания HTML-страниц Django?
Я знаю, что об этом уже спрашивали, но я не могу разобраться в правильной терминологии, чтобы найти, как это называется или как это сделать. У меня есть динамическая таблица, в которой в один день может быть 5 элементов, а в другой 10 (взятых из БД), я собираюсь создать гиперссылки в таблице, которые затем откроют другую HTML страницу специально для этого объекта списка. Я не могу понять, как это сделать? То, как я сейчас работаю с Django, заключается в том, что я создаю HTML файл и URL вид для каждой конкретной страницы, но если я однажды захочу создать 3, а на следующий день 5, как я могу это сделать, прямо сейчас мой разум не может понять, как динамически создать HTML файл для каждого объекта в списке, используя только один шаблон? Просто ищу кого-нибудь, кто скажет мне, как это называется, если это вообще возможно, или что я могу поискать в документации Django, чтобы найти примеры?
То, что я думаю, вы хотите, называется detail страницей. Я назову модель Item. Вы можете легко создать детальные представления для каждого элемента, сделав что-то вроде следующего в вашем urls.py:
# urls.py
urlpatterns = [
...
path('your_details_view/<int:pk>', views.your_details_view, name='your_details_view'),
...
]
Тогда следующее в ваших представлениях:
# views.py
# view of the page with all the links:
def your_dynamic_table_view(request):
items = Item.objects.all()
# rest of your code
return render(request, 'your_app/dynamic_table.html', {'items': items})
# view for the details page
def your_details_view(request, pk):
# your code
# Here is where you will get the particular item based on the pk that was in the <a href> link
item = Item.objects.get(pk=pk)
return render(request, 'your_app/detail_view.html', {'item': item})
Теперь, в вашей таблице вы можете поместить ссылки на все, что-то вроде этого в вашем dynamic_table.html:
dynamic_view.html:
{% for item in items %}
<a href="{% url for 'your_details_view' item.pk %}">{{ item }}</a>
{% endfor %}
Теперь ссылка перейдет на страницу your_details_view, которая отобразит html-страницу, специфичную для пк этого элемента. (Это не обязательно должен быть пк, или даже целое число). Переменная item.pk в теге якоря href используется для того, чтобы при нажатии на нее вы перешли на страницу your_details_view, которая отобразит html-страницу, .../your_details_view/45 в качестве примера, где 45 - это пк, который я придумал для данного товара. Эта переменная pk (первичный ключ конкретного товара) затем может быть использована в вашей странице detail_view.html:
detail_view.html:
Here you have access to the all of the fields
of the particular item, say item with pk=45, if
that is pk in the <a href> tag. For example if the
item has a field called price, then you can do:
<p>The price of this item is: {{ item.price }}</p>
Примечание Я просто придумал название item. Например, если у вас есть модель, которую вы называете Item, то в шаблоне, где у вас будут все ссылки (НЕ на детальной странице), вы можете передать все объекты Item, а затем перебирать их, чтобы создать все ссылки.
Причина, по которой вы получаете одинаковые значения, заключается в том, что вы каждый раз отправляете один и тот же список. Обратите внимание, что вы НЕ отправляете один и тот же элемент, поскольку вы используете pk для получения конкретного элемента. Вот почему каждая ссылка вверху дает вам что-то конкретное.
def your_details_view(request, pk):
# Here you are getting the SPECIFIC Nbav8 instance, and the links in your template,
# <a href="{% url 'your_details_view' item.pk %}">{{ item }}</a>
# the link will have that specific item's pk in the url, thus generating
# a specific page to that item.
item = Nbav8.objects.using('totals').get(pk=pk)
# Everything beyond here looks like it's getting lists that do not depend
# on the specific item previously gotten.
current_day_home_team = list(Nbav8.objects.using('totals').values_list('home_team_field', flat=True))
current_day_away_team = list(Nbav8.objects.using('totals').values_list('away_team_field', flat=True))
awayuyu = []
homeuyu = []
for team in current_day_home_team:
home_team_list1 = PreviousLossesNbav1WithDateAgg.objects.using('totals').filter(Q(away_team_field=team) | Q(home_team_field=team)).values_list('actual_over_under_result_field', flat=True)
homeuyu.append(list(home_team_list1[:5]))
home_team_list2 = homeuyu
for team in current_day_away_team:
away_team_list1 = PreviousLossesNbav1WithDateAgg.objects.using('totals').filter(Q(away_team_field=team) | Q(home_team_field=team)).values_list('actual_over_under_result_field', flat=True)
away_teamdd = away_team_list1[:5]
awayuyu.append(list(away_team_list1[:5]))
away_team_list2 = awayuyu
return render(request, 'home/testing2.html', {'item': item, 'away': away_team_list2, 'home': home_team_list2})
Я не уверен, какой конкретный список должен получить каждый объект Nbav8 на своей странице, и мой недостаток спортивных знаний затрудняет понимание того, что вы пытаетесь показать.
Предложения:
Прежде чем идти дальше, есть некоторые вещи, которые вы, возможно, захотите рассмотреть сейчас, например
Не зная вашего начального кода, я придумал имя your_details_view, но более естественным именем может быть current_game, чтобы оно соответствовало вашей таблице с множеством current_game'ов.
Иметь в url имена с пробелами - не самая лучшая идея. Возможно, вы можете добавить в объекты Nbav8 поле типа url_name, и использовать его вместо pk в теге якоря и пути.
path('your_details_view/<str:url_name>', views.your_details_view, name='your_details_view'),
Затем в вашем html
<a href="{% url 'your_details_view' item.url_name %}">{{ item }}</a>
Нижняя линия
Вы должны найти способ your_details_view создать список, специфичный для данного товара, чтобы при отправке на страницу подробностей этого товара появлялся только этот список.