Использование списка 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 создать список, специфичный для данного товара, чтобы при отправке на страницу подробностей этого товара появлялся только этот список.

Вернуться на верх