【问题标题】:Django: render template based on request data with class-based viewsDjango:使用基于类的视图基于请求数据呈现模板
【发布时间】:2014-02-18 10:10:15
【问题描述】:

我想做的事:

使用一些默认输入日期值生成页面并根据这些值生成一些数据。 选择新的数据值时,我们会生成更新的数据。

考虑到我想扩展的应用程序结构,我正在使用基于类的视图。

什么不起作用:

模板已渲染,但我无法动态获取“开始”和“结束”的值来生成更新的数据。

我的问题:

就 Django 标准实践而言,这样的结构是否正确且合乎逻辑?你能指出我的代码不正确的地方吗?

我的问题与topic 有关。但我想在视图中保留所有逻辑。

非常感谢。

这里有一点简化的代码:

index.html

   {% extends "base.html" %} 
   {% block main %}
        {% include "_usage.html" %}
        {{ generated_data }}
        {{ table.render }}
    {% endblock %}

_usage.html

<div class="name">
    <span>From: <input id="id_start" name="start" type="text" value="{{ start }}"></span>
    <span>To: <input id="id_end" name="end" type="text" value="{{ end }}"</span>
    <button class="name" type="submit">Submit</button>
</div>

urls.py

urlpatterns = patterns('',
    url(r'^$', GenericView.as_view(), name='index'),
)

views.py

from django.views.generic.base import View
from django.template.response import TemplateResponse

class UsageView(View):
    template_name = '_usage.html'
    default_start = '2014-01-01'
    default_end = '2014-01-02'

    def get(self, request):
        data_dict = {'start': self.default_start, 'end': self.default_end}
        response = TemplateResponse(request, self.template_name, data_dict)
        return response

class GenericView(UsageView):
    template_name = 'index.html'

    def get(self, request):
        super(GenericView, self).get(request)

        start_value = request.GET['start']
        end_value = request.GET['end']
        values = '1, 2, 3'

        data_dict = {'start': start_value, 'end': end_value, 'generated_data': values}

        response = TemplateResponse(request, self.template_name, data_dict)
        return response

【问题讨论】:

  • _usage.html 是如何工作的?它似乎没有任何 HTML 表单。
  • 抱歉,不清楚。我更新了我的问题。我扩展了一个 base.html 文件。它具有生成基本 html 页面所需的所有 html 代码。

标签: django django-views


【解决方案1】:

这里有很多问题。

首先,您在 GenericView 中的 super 调用毫无意义 - 您调用了超级函数,但随后将结果丢弃。但是无论如何,您实际上无法对该返回值执行任何操作,因为它返回的是呈现的响应,而不是您可以用来呈现模板的上下文值。

而不是继承View和覆盖get,你应该覆盖TemplateView和覆盖get_context_data:然后你的方法可以简单地关注设置相关值,视图本身将负责渲染模板。

其次,_usage.html 中没有实际的表单元素。这意味着提交按钮不会做任何事情,因此您永远不会在 request.GET 中收到您的字段值。您需要使用&lt;form action="." method="GET"&gt; ... &lt;/form&gt; 包装字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 2018-03-25
    • 1970-01-01
    • 2015-08-10
    • 2014-02-16
    • 1970-01-01
    • 2013-06-25
    相关资源
    最近更新 更多