【发布时间】:2014-10-12 11:05:45
【问题描述】:
我将通过在我的views.py 中对ListView 进行子类化来实现一个基于自定义类的通用视图。我的问题是如何能够访问我的子类中的请求(HttpRequest 对象)参数?我所涉及的 HttpRequest 对象是 views.py 中所有函数的默认请求参数。示例:
def search(request):
为了更清楚,这是我迄今为止尝试过的:
**views.py
class CustomListView(ListView):
temp = ""
def get(self, request, *args, **kwargs):
self.temp = request.GET.get('temp')
return super(CustomListView, self).get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(CustomListView, self).get_context_data(**kwargs)
context['temp'] = self.temp
return context
**urls.py
url(r'^temp/$, CustomListView.as_view(queryset=Document.objects.all()[:1],template_name="temp.html")),
**temp.html
{% extends 'base.html' %}
{% block content %}
<h2>{{ temp }}
{% endblock %}
但是当我运行服务器并访问 /temp/ (temp.html) 时,我看到的只是“无”。所以意思是,'temp' 是 "" 或根本没有创建'temp'。
非常感谢任何想法。谢谢!
【问题讨论】:
-
一般情况下,您可以在尚未通过请求的 CBV 方法中使用
self.request。但是,您正尝试从查询字符串 (request.GET.get('temp')) 中设置temp,所以您使用的是什么 URL。例如example.com/temp/?temp=whatever?? -
感谢史蒂文。所以只是为了澄清你在说什么,我可以在我的 get_context_data 覆盖函数上执行 context['temp'] = self.request 吗?再次,谢谢!
-
你可以在你的
get_context_data方法中有context['temp'] = self.request.GET.get('temp'),然后完全删除你的get覆盖方法。 -
为什么不在模板中使用
{{ request.GET.temp }}? -
你不应该重写
get和post方法,除非你100%确定你在做什么。 CBV 有一堆方法可以满足各种需求,如果其他方法都失败了,请先尝试修改dispatch。
标签: python django django-class-based-views