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 реального города в моей БД и не выбрасывать исключение из цикла в представлении?