【问题标题】:Can't get data from Django View into template无法将 Django View 中的数据获取到模板中
【发布时间】:2016-12-09 13:10:20
【问题描述】:

我正在尝试发送一些数据以在模板中呈现表格。数据不是QuerySet 或任何东西,它是我从 Django Rest Framework 端点获得的自定义元组列表。

我有以下看法:

class GetPointsView(FormView):
    form_class = forms.GetPointsForm
    template_name = 'get_points.html'
    success_url = reverse_lazy('get_points')

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        var = request.POST['var_field']
        if form.is_valid():
            # Call another view to get the data, based on 'var'.
            response = MyView().get(request, var)
            # The template never handles this data.
            data = json.loads(response.data)
            # And even this doesn't work...
            # data = [('foo', 'bar'), ('baz', 'guido')]
            return HttpResponseRedirect(
                self.get_success_url(),
                {'mydata': data}
            )
        else:
            return self.form_invalid(form)

还有以下模板:

{% extends 'base.html' %}
{% load bootstrap3 %}
{% load crispy_forms_tags %}

{% block content %}
    {% crispy form %}

    {% if mydata %}
    <hr>

    <table>
        <tr>
            <th>Col A</th>
            <th>Col B</th>
        </tr>
        {% for cola, colb in mydata %}
        <tr>
            <td>{{ cola }}</td>
            <td>{{ colb }}</td>
        </tr>
        {% endfor %}
    </table>
    {% endif %}
{% endblock %}

{% if mydata %}} 似乎永远不会是真的。 data = [('foo', 'bar'), ('baz', 'guido')] 甚至不起作用这一事实表明我在这里遗漏了一些东西。

我的数据格式是否有问题,或者我如何将其发送到模板?


用答案编辑

所以,虽然我之前尝试过 Django 的 render 快捷方式,但我现在只能让它工作。这就是解决我的问题的方法:

return render(self.request,
              self.template_name,
              {'form': form, 'mydata': data})

【问题讨论】:

  • 将 {% if data %}} 更改为 {% if mydata %}。
  • 不是你的问题的原因,但你不应该覆盖后模型。您唯一要自定义的是在 is_valid 块内;所以把它变成form_valid() 方法。
  • @Aki003,对不起,当我匿名问题时,{%if data %} 是一个错字。删除多余的 } 并没有解决我的问题。
  • @DanielRoseman 谢谢,我的代码突然看起来很干燥。 :)
  • @DanielRoseman 做一件事,只是转储 {{mydata}} 的输出并检查它是否显示任何内容,也许你可以放一个图片链接。我是这样调试的。

标签: python django django-templates


【解决方案1】:

渲染上下文中的键是“mydata”,因此您应该使用{% if mydata %}。此外,您在该行末尾还有一个额外的}

【讨论】:

  • 抱歉,{%if data %} 在我匿名问题时是一个错字。删除多余的 } 并没有解决我的问题。
  • 好吧,现在已经不碍事了。您将数据作为参数传递给重定向。然后您尝试从模板访问它。模板需要与上下文一起呈现,否则您的数据会在途中丢失(不确定 HttpResponse 类如何处理额外的参数)。因此,您需要使用 get_template() 创建一个实际的模板对象,并在上下文中使用您的数据呈现它。试试看。
  • 更新代码以返回渲染模板而不是重定向,我们可以确定从那里去哪里。
  • 好的,我尝试渲染模板。 “VariableDoesNotExist:在 u 中查找键 [form] 失败”[{'False': False, 'None': None, 'True': True}, {'points_data': [('foo', 'bar'), ('baz', 'guido')]}]""。所以,数据就在那里,但由于我试图在一个页面上组合一个表单和一个表格,所以它提出了。
  • 你能更新代码,让我看看你在尝试什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 2019-06-18
  • 2017-02-27
  • 1970-01-01
  • 2015-03-04
  • 2015-09-26
相关资源
最近更新 更多