Django: как реализовать функциональную кнопку удаления для объекта, где представление циклически просматривает данные api запроса?

В принципе, у меня есть небольшое приложение погоды из учебника, которому я следовал, и я пытаюсь расширить функциональность. Приложение принимает от пользователя POST запрос на ввод города, вызывает openweather api, перебирает все города, затем добавляет данные openweather api (dict) в список python. Затем список вызывается переменной 'context' для отображения данных в шаблоне. Я пытаюсь добавить функциональную кнопку удаления к каждому городу, показанному на странице, звучит просто, но поскольку представление делает вызов api и помещает его в список, эти данные не имеют city.id. Это приводит к ошибке NoReverseMatch в моем шаблоне.

Я попытался разделить представление на части. Если я отделяю cities = City.objects.all() и просто устанавливаю context = {'cities': cities}, моя функция city_delete работает правильно с city.id. Я смог удалить город из шаблона. Но я не могу вывести данные api в ту же карту bootstrap из-за контекстного диктанта.

Views.py

urls.py

from django.urls import path
from . import views

urlpatterns = [
        path('', views.index, name='home'), # path for index view (working)

        path('index_test', views.index_test, name='index_test'), # path for index test (failed)
        path('delete_city/<city_id>/', views.delete_city, name='delete_city'), # delete city url

        path('word_page/', views.word_view, name='word_page'), 
        path('delete_word/<word_id>/', views.delete_word, name='delete_word'), # test word delete (working)
        path('about/', views.AboutPageView.as_view(), name='about'),
        
        ]

index.html

{% extends 'weather/base.html' %}

{% block content %}

<body style='background-image: linear-gradient(to right, blue, black)'>
    <section class="section">
        <div class="container">
            <div class="columns">
                <div class="column is-offset-4 is-4">
                    <form method="POST">
                        {% csrf_token %}
                        <div class="field has-addons">
                            <div class="control is-expanded">
                                {{ form.name }} 
                            </div>
                            <div class="control">
                                <button class="button is-info">
                                    Add City
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </section>
    <section class="section">
        <div class="container">
            <div class="columns">
                <div class="column is-offset-4 is-4">
                    {% for weather in weather_data %}
                    <div class="box">
                        <article class="media">
                            <div class="media-left">
                                <figure class="image is-50x50">
                                    <img src="http://openweathermap.org/img/w/{{ weather.icon }}.png" alt="Image">
                                </figure>
                            </div>
                            <div class="media-content">
                                <div class="content">
                                    <p>
                                    <span class="title">{{ weather.city }}</span>
                                        <br>
                                        <span class="subtitle">{{ weather.temperature }}</span>
                                        <br> {{ weather.test }}
                                    </p>
                                </div>
                            </div>
                            <a href='{% url "delete_city" city.id %}' class='btn btn-danger btn-sm'>Delete</a>


                        </article>
                    </div>
                    {% endfor %}
                </div>
            </div>
        </div>
    </section>
    <!--footer class="footer">
    </footer-->
</body>
</html>

models.py

from django.db import models

class City(models.Model):
    name = models.CharField(max_length=25)

    def __str__(self): # Show the actual city name on admin dashboard
        return self.name

    class Meta: # Show the plural of cities instead of citys
        verbose_name_plural = 'cities'


# Testing word delete function
class Words(models.Model):
    name = models.CharField(max_length=20)

    def __str__(self):
        return self.name

Я скопировал весь код index.html в index_test.html для тестирования и соединил его с index_test(request) представлением.

В html-файле я в основном возился со строками {% for weather in weather_data %}, а также <a href='{% url "delete_city" city.id %}' class='btn btn-danger btn-sm'>Delete</a>

Как и раньше, когда я пытаюсь загрузить index_test.html, я получаю эту ошибку:

Когда я меняю <a href='{% url "delete_city" city.id %}' class='btn btn-danger btn-sm'>Delete</a> на <a href='{% url "about" %} (как заполнитель), я не получаю эту ошибку.

Когда я меняю {% for weather in weather_data %} на {% for city in cities %}, я могу перебрать города в БД и правильно удалить их из шаблона. Но данные api не отображаются.

Чем больше я пытаюсь объяснить это, тем ближе я чувствую себя к решению этой проблемы. Я уверен, что это как-то связано с тем, как city_id путается в URL delete_city/<city_id>/ из-за данных api в контексте. Возможно, я посплю и вернусь со свежими мыслями. В любом случае заранее спасибо всем, кто прочитает.

Итак, мой вопрос заключается в том, как я могу заставить эту функцию удаления принимать id реального города в моей БД и не выбрасывать исключение из цикла в представлении?

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