我要做的是:
生成包含一些默认输入日期值的页面,并根据这些值生成一些数据。 选择新数据值时,我们会生成更新数据。
我正在使用基于类的视图,考虑我想扩展的应用程序结构。
什么不行:
模板被渲染,但我无法动态获取'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
答案 0 :(得分:1)
这里有很多问题。
首先,您在GenericView中的super
调用毫无意义 - 您调用超级函数,但随后将结果抛出。但是你实际上无法对返回值做任何事情,因为它返回一个渲染的响应,而不是你可以用来渲染模板的上下文值。
您应该覆盖View
并覆盖get
,而不是继承TemplateView
并覆盖get_context_data
:那么您的方法可以简单地关注设置相关值,以及视图本身将负责渲染模板。
其次,_usage.html中没有实际的表单元素。这意味着提交按钮不会执行任何操作,因此您将不会在request.GET中收到您的字段值。您需要使用<form action="." method="GET"> ... </form>
包装字段。