django — как сохранить данные API в модель с помощью кнопки шаблона

#python #django #yelp #yelp-fusion-api

#python #django #yelp #yelp-fusion-api

Вопрос:

Я использую Yelp API для поиска панелей в любом месте. При этом используется шаблон, называемый results.html у этого есть кнопка. Нажатие этой кнопки должно сохранить уникальный идентификатор панели Yelp API в моих моделях. В моем словаре результатов, который я просматриваю, я называю это «id». Вот тут у меня возникают проблемы: я беру идентификатор из шаблона, сохраняю его в представлениях add_list в панели инструментов модели. Это не сохранится в моей базе данных, я считаю, что основная проблема заключается в моей логике в add_list.

Я получаю следующую ошибку. Длинная строка — это идентификатор из цикла. Results.id .

 IntegrityError at /add/Jlhck4bGoXaXfuoMOKGRww/

NOT NULL constraint failed: API_barlist.api_id
  

Views.py

 def index(request):
    if request.method == 'POST':
        form = CityForm(request.POST)
        if form.is_valid():
            city = form.cleaned_data['city_name']
            API_KEY = 'MyAppKey'
            url = 'https://api.yelp.com/v3/businesses/search'
            headers = {'Authorization': 'Bearer {}'.format(API_KEY)}
            params = {'term':'bar','location':city}
            req = requests.get(url, params=params, headers=headers)
            parsed = json.loads(req.text)
            businesses = parsed["businesses"]
            final_result = []

            for business in businesses:
                results = {
                'id': business['id'],
                'business': business['name'],
                'rating': business['rating'],
                'image_url': business['image_url']
                }
                final_result.append(results)

            context = {'final_result': final_result}
            return render(request, 'API/results.html', context)
    else:
        form = CityForm()
    return render(request, 'API/home.html', {'form':form})

def add_list(request):
    if request.method == 'POST':
        api_id = request.POST.get("id")
        Bar = BarList(api_id=api_id)
        Bar.save()
    else:
        return render(request, 'API/results.html')
  

Models.py

 class BarList(models.Model):
    api_id = models.CharField(max_length=100)
  

Urls.py

 urlpatterns = [
    path('', views.index, name='API-home'),
    path('list', views.list, name='API-list'),
    path('add/<str:results>/', views.add_list, name='API-add') ]
  

results.html шаблон

 {% extends "API/base.html" %}
{% block content %}

{% for results in final_result %}

<h3>{{ results.business }}</h3>

<form action="{% url 'API-add' results.id %}" method="POST">
  {% csrf_token %}
  <input type="submit" value="Add Item to List" />
</form>

{% endfor %}
{% endblock content %}
  

Ответ №1:

Несколько вещей, которые мне нужно было сделать. Ошибка ограничения not null исправлена путем добавления ограничения к модели. Кроме того, мне нужно было закончить написание своего представления для правильного сохранения.

Обновленные модели

 class BarList(models.Model):
    api_id = models.CharField(max_length=100, null=False)
    user = models.ForeignKey(User,on_delete=models.CASCADE,null=True,related_name="user")
  

Обновленный вид

 def add_list(request,results):
    if request.method == 'POST':
        Bar = BarList(api_id=results,user=request.user)
        Bar.save()
        return HttpResponseRedirect('/')
    else:
        return render(request, 'API/results.html')