Принятие формы ответа, вызов API, затем отображение вызова API в Django - PullRequest
1 голос
/ 09 октября 2019

Я пытаюсь получить данные формы Django из пользовательского ввода, взять ввод, чтобы сделать вызов API для Aylien API и отобразить необработанный результат json на той же странице.

Я могу принять форму ввода и успешно выполнить вызов API и получить JSON для печати на консоли, но мне трудно отобразить результат вызова на странице.

Я продолжаю получать UnboundLocalError: локальная переменная 'api_response', на которую ссылается перед присвоением , ошибка. Код ниже

models.py

from django.db import models

# Create your models here.
class News(models.Model):
    title = models.TextField(max_length=120)

form.py

from django import forms
from .models import News

class NewsForm(forms.ModelForm):
    class Meta:
        model = News
        fields = [
            'title']

views.py

from django.shortcuts import render
from .models import News
from .form import NewsForm
import requests
import aylien_news_api
from aylien_news_api.rest import ApiException

def news_create_view(request):
    ## link form to model for gathering search term from user
    form = NewsForm(request.POST)

    if form.is_valid():
        # create an instance of the aylien api class
        api_instance = aylien_news_api.DefaultApi()

        ## build opts for api call from the response from the user
        opts = {
            'title': form.cleaned_data['title'],
            'language': ['en'],
            'not_language': ['es', 'it'],
            'published_at_start': 'NOW-7DAYS',
            'published_at_end': 'NOW'
        }
        try: 
            # List the stories
            api_response = api_instance.list_stories(**opts)
        except ApiException as e:
            print("Exception when calling DefaultApi->list_stories: %s\n" % e)

        ## re-instantiate the form and save to admin    
        form.save()
        form = NewsForm()

    else:
        form = NewsForm()

    ## context for models
    context = {
        'form': form,
        'api_response': api_response
    }

    ## render pages in Django dynamically (static HTML is slow to load)
    return render(request, "news/show_result.html", context)

show_result.html

<div class="row">
    <form method="GET"> {% csrf_token %}
        <!-- the 'as_p' method turns the django-rendered form into html for the user -->
        {{ form.as_p }}
        <input type="submit", value="Search" />

    </form>

</div>
<div class="row"> 
    {{ api_response }}
</div>

Я, очевидно, что-то делаю не так, просто не могу понять, что

1 Ответ

1 голос
/ 09 октября 2019

Вы получаете эту ошибку, потому что ваша форма недействительна, и api_response будет определен только в том случае, если форма действительна.

Чтобы исправить вашу проблему, измените это:

form = NewsForm(request.POST)

Для этого:

form = NewsForm(request.POST or None)

Если вы сделаете GET для своего просмотра, ваша форма будет недействительной, если вы пропустите пустой request.POST, поэтому вам нужно вместо этого передать None.

Наконец, я бы рекомендовал добавить api_response = None в ваше предложение else. Это предотвратит неопределенность api_response, и ваш сервер не выдаст ошибку 500, если кто-то вмешивается в форму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...