Как добавить данные из API в базу данных Django, когда я нажимаю на кнопку

Мой вопрос будет разделен на две половины для лучшего понимания. Первая половина: Я пытаюсь добавить кучу данных, которые я отобразил на странице из конечной точки API, в мою базу данных, когда я нажимаю "Добавить в мои записи", как показано на изображении ниже, имея в виду, что есть много других карточек, например, для других стран, и я пытаюсь сохранить в базе данных только "Дата и страна": введите описание изображения здесь

и вторая половина, это после добавления в базу данных я хочу отобразить их на другой странице, и если база данных пуста, или пользователь еще не добавил никаких данных в базу данных, я хочу, чтобы страница показывала "сейчас данные для отображения", но если пользователь добавил, я хочу отобразить то, что есть в базе данных.

введите описание изображения здесь

Вот что я пробовал до сих пор:

models.py

from django.db import models


class CountryData(models.Model):
    country = models.CharField(max_length=100)
    date = models.DateTimeField()

    def __str__(self):
        return self.country

views.py

def all_countries(request):
    first_response = requests.get('https://api.covid19api.com/summary').json()
    results =  len(first_response['Countries'])
    my_new_list = []


    for i in range(0, results):
        my_new_list.append(first_response['Countries'][i])

    # print(my_new_list)
    if request.method == "POST":
        if request.POST.get('country') and request.POST.get('date'):
            added_record = CountryData()
            added_record.country = request.POST.get('country')
            added_record.date = request.POST.get('date')
            added_record.save()
            messages.success(request, "Record Added to Database Successfully!")
            return render(request,'allcountries.html')
        else:
            return render(request,'allcountries.html')


    context = {'my_new_list': my_new_list}
    return render(request, 'allcountries.html', context)


class MyRecords(ListView):
    template_name = 'myrecords.html'
    model = CountryData
    context_object_name = "records_list"



class DeleteMyRecord(DeleteView):
    template_name = "deleterecord.html"
    model = CountryData
    success_url = '/'

urls.py

from django.urls import path, include
from .views import home, all_countries, MyRecords, DeleteMyRecord


urlpatterns = [
    path('', home, name='home'),
    path('allcountries', all_countries, name='all_countries'),
    path('myrecords', MyRecords.as_view(), name='my_records'),
    path('record-delete/<int:pk>', DeleteMyRecord.as_view(), name='record_delete'),
   
]

allcountries.html

{% extends '_base.html' %}


{% block page_title %} Covid19 Statistics For All Countries {% endblock %}


{% block content %}


<br>


<h3 class="text-center">Covid19 Statistics For All Countries  </h3>

<br>

{% for object in my_new_list %}


<div class="row justify-content-center">
    <div class="col-sm-10 d-flex justify-content-center">
        <div class="card text-dark text-center" style="width: 20rem;">
            <div class="card-block card-body">
                <form method="POST" action="{% url 'all_countries' %}">
                    {% csrf_token %}
                <h5 name = "country" class="card-header">Country: {{object.Country}}</h5>
                <p class="card-text">Total Confirmed Cases: {{object.TotalConfirmed}} </p>
                <p class="card-text">Total Deaths Cases: {{object.TotalDeaths}} </p>
                <p class="card-text">Total Recovered Cases: {{object.TotalRecovered}} </p>
                <p class="card-text" name="date">Date: {{object.Date}} </p>
                <button type = "submit" class = "btn-danger btn-sm">ADD TO MY RECORDS </button>
                <!-- <input type="submit" name="" id="" value="ADD TO MY RECORDS"> -->
            </form>
            </div>
        </div>
        <br>
    </div>

</div>

{% endfor %}

{% endblock %}

myrecords.html

{% extends '_base.html' %}


{% block page_title %} My Records {% endblock %}


{% block content %}

{% for record in records_list %}

<div class="container">
    <div class="row">
      <div class="col-md-4">
        <div class="card text-dark" style="width: 30rem;">
          <h3 class="card-header">Country: {{record.country}}</h3>
          <div class="card-body">
            <p class="card-text">Date: {{record.date}} </p>
          </div>
          <button><a href="/record-delete/{{record.id}}">Delete</a></button>
          <br>
        </div>
        <br>
      </div>
    </div>
  </div>
{% endfor %}


{% endblock %}


deleterecord.html

{% extends '_base.html' %}

{% block page_title %} Delete {{record.country}} {% endblock %}

{% block content %}

<h4>Press Delete to complete</h4>

    <form class='well form-horizontal' action="" method="POST">
            {% csrf_token %}
            <div class="form-group">
                {{form.as_p}}
            </div>
            <input type="submit" class="delete-button" value="Delete!">
    </form>

{% endblock %}

Для добавления данных из API в базу данных Django при нажатии на кнопку, вы можете использовать JavaScript для отправки AJAX запроса на ваш Django сервер при нажатии на кнопку. Вот пример того, как вы можете это сделать:

  1. Сначала создайте функцию представления Django, которая будет обрабатывать запрос на добавление данных в базу данных. Это представление должно проверить метод запроса и убедиться, что это запрос POST. Оно также должно аутентифицировать запрос и убедиться, что пользователь имеет необходимые разрешения для добавления данных в базу данных.

    .
    @login_required
    def add_data(request):
        if request.method == 'POST':
            # Get the data from the API
            data = request.POST.get('data')
            # Add the data to the database
            MyModel.objects.create(data=data)
                return HttpResponse('Data added to the database')
        else:
            return HttpResponseBadRequest('Bad request')
    
  2. Далее, создайте кнопку в вашем HTML шаблоне, которая будет отправлять AJAX запрос при нажатии на нее. Вы можете использовать атрибут data-url для указания URL представления Django, которое будет обрабатывать запрос.

    <button id="add-button" data-url="{% url 'add_data' %}">Add Data</button>
    
  3. Наконец, используйте JavaScript для отправки AJAX-запроса при нажатии на кнопку. Для этого можно использовать функцию jQuery $.ajax.

    .
     $(document).ready(function() {
     $('#add-button').click(function() {
         var url = 
     $(this).attr('data-url');
     $.ajax({
         url: url,
         type: 'POST',
         data: {
             'data': 'your data here'
         },
         success: function(response) {
             console.log(response);
         },
         error: function(response) {
             console.log(response);
         }
     });
      });
     });
    

Это просто пример того, как можно добавить данные из API в базу данных Django при нажатии на кнопку. Вам может понадобиться изменить этот код в соответствии с вашими конкретными потребностями.

Надеюсь, это поможет!

Чтобы добавить данные из API в базу данных Django при нажатии на кнопку в Django, вы можете выполнить следующие шаги, и это должно сработать:

1)Создайте форму в вашем шаблоне Django, которая включает кнопку для отправки формы. Форма также должна включать любые другие необходимые поля, например, поле ввода для URL API.

<form method="post" action="{% url 'import_data' %}">
  {% csrf_token %}
  <label>API URL: <input type="text" name="api_url"></label>
  <button type="submit">Import data</button>
</form>

2) Напишите функцию представления для обработки отправки формы и импорта данных из API. Представление должно получить данные из API, разобрать их в формат, подходящий для вашей модели Django, и использовать Django ORM (Object-Relational Mapper) для создания или обновления экземпляров модели с полученными данными.

import requests

from django.shortcuts import render
from django.http import HttpResponse

def import_data(request):
    if request.method == 'POST':
        # Read the API URL from the request
        api_url = request.POST['api_url']

        # Fetch the data from the API
        response = requests.get(api_url)
        data = response.json()

        # Iterate over the data and create or update the model instances
        for item_data in data:
            # Extract the fields we want to save
            name = item_data['name']
            description = item_data['description']

            # Check if the item already exists in the database
            item, created = Item.objects.update_or_create(
                name=name,
                defaults={'description': description},
            )
        return HttpResponse('Data imported successfully')
    else:
        return render(request, 'import.html')

3) Добавьте шаблон URL для функции view в файл urls.py вашего приложения Django.

from django.urls import path
from . import views

urlpatterns = [
    path('import/', views.import_data, name='import_data'),
]

Теперь, когда вы отправите форму, данные из API будут извлечены и сохранены в базе данных Django.

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