Не удалось разобрать остаток: '[0]' из 'норм [0]' - перенос приложения фляги на Django 2 - PullRequest
0 голосов
/ 11 января 2019

У меня есть этот метод на моем views.py:

def getExchangeRates(request):
""" Here we have the function that will retrieve the latest rates from fixer.io """
rates = []
response = urlopen('http://data.fixer.io/api/latest?access_key=c2f5070ad78b0748111281f6475c0bdd')
data = response.read()
rdata = json.loads(data.decode(), parse_float=float) 
rates_from_rdata = rdata.get('rates', {})
for rate_symbol in ['USD', 'GBP', 'HKD', 'AUD', 'JPY', 'SEK', 'NOK']:
    try:
        rates.append(rates_from_rdata[rate_symbol])
    except KeyError:
        logging.warning('rate for {} not found in rdata'.format(rate_symbol)) 
        pass

return render(request, 'index.html', rates)

Это мой шаблон (изначально из приложения Flask):

{% block header %}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

<div align="center" style="margin-top:35px;"><a href="/historical"><button type="button" class="btn btn-primary">Historical</button></a></div>
{% endblock %}
{% block body %}

<script type="text/javascript" src="https://www.google.com/jsapi"> </script>
<div id="chart_div"  style="width: 900px; height: 500px;"><div>


<script type='text/javascript'>//<![CDATA[ 

google.load('visualization', '1', {packages: ['corechart', 'bar']});
google.setOnLoadCallback(drawBasic);

function drawBasic() {

     var data = google.visualization.arrayToDataTable([
       ['Currency', 'Rate', { role: 'style' }],
       ['USD', {{rates[0]}}, 'gold'],
       ['GBP', {{rates[1]}}, 'silver'],
       ['HKD', {{rates[2]}}, 'brown'],
       ['AUD', {{rates[3]}}, 'blue'],
       ['SEK', {{rates[1]}}, 'red'],
       ['JPY', {{rates[2]}}, 'yellow'],
       ['NOK', {{rates[3]}}, 'orange'],
     ]);



  var options = {
    title: 'Exchange rate overview',
    chartArea: {width: '50%'},
    hAxis: {
      title: '',
      minValue: 0
    },
    vAxis: {
      title: ''
    }
  };

  var chart = new google.visualization.BarChart(document.getElementById('chart_div'));

  chart.draw(data, options);
}
//]]>  

</script>

{% endblock %}

Теперь, это бросает мне это:

Internal Server Error: /
Traceback (most recent call last):
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/core/handlers/base.py", line 124, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/kristian/user/user/fixerio/views.py", line 23, in getExchangeRates
return render(request, 'index.html', rates)
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/shortcuts.py", line 36, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/template/loader.py", line 61, in render_to_string
template = get_template(template_name, using=using)
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/template/loader.py", line 15, in get_template
return engine.get_template(template_name)
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/template/backends/django.py", line 34, in get_template
return Template(self.engine.get_template(template_name), self)
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/template/engine.py", line 144, in get_template
template, origin = self.find_template(template_name)
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/template/engine.py", line 126, in find_template
template = loader.get_template(name, skip=skip)
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/template/loaders/base.py", line 30, in get_template
contents, origin, origin.template_name, self.engine,
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/template/base.py", line 156, in __init__
self.nodelist = self.compile_nodelist()
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/template/base.py", line 194, in compile_nodelist
return parser.parse()
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/template/base.py", line 478, in parse
raise self.error(token, e)
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/template/base.py", line 476, in parse
compiled_result = compile_func(self, token)
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/template/loader_tags.py", line 209, in do_block
nodelist = parser.parse(('endblock',))
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/template/base.py", line 449, in parse
raise self.error(token, e)
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/template/base.py", line 447, in parse
filter_expression = self.compile_filter(token.contents)
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/template/base.py", line 563, in compile_filter
return FilterExpression(token, self)
File "/home/kristian/.virtualenvs/user/lib/python3.6/site-packages/django/template/base.py", line 663, in __init__
"from '%s'" % (token[upto:], token))
django.template.exceptions.TemplateSyntaxError: Could not parse the remainder: '[0]' from 'rates[0]'

Неправильная строка на представлении - это return render(request, 'index.html', rates)

Я читал, что, вероятно, это связано с тем, как я пытаюсь получить предметы, {{rates[0]}}, опять же, во Flask это работает отлично, теперь мне просто нужно настроить некоторые вещи, чтобы сделать его совместимым с Django.

Есть идеи?

1 Ответ

0 голосов
/ 11 января 2019

Это проблема синтаксиса. В шаблоне django мы не получаем доступ к индексам так же, как к python. Для этого мы используем точечную запись. Итак, вы должны изменить

{{rates[0]}}

до

{{rates.0}}

Ссылка:

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