Django:基于基于类的视图的请求数据呈现模板

时间:2014-02-18 10:10:16

标签: django django-views

我要做的是:

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

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

什么不行:

模板被渲染,但我无法动态获取'start'和'end'值以生成更新的数据。

我的问题:

这种结构在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

1 个答案:

答案 0 :(得分:1)

这里有很多问题。

首先,您在GenericView中的super调用毫无意义 - 您调用超级函数,但随后将结果抛出。但是你实际上无法对返回值做任何事情,因为它返回一个渲染的响应,而不是你可以用来渲染模板的上下文值。

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

其次,_usage.html中没有实际的表单元素。这意味着提交按钮不会执行任何操作,因此您将不会在request.GET中收到您的字段值。您需要使用<form action="." method="GET"> ... </form>包装字段。