【发布时间】:2012-02-12 18:52:53
【问题描述】:
我正在尝试学习基于类的视图,因为详细视图或列表视图并不复杂。
我有一个搜索表单,我只是想看看我是否发送查询以显示结果。
这是函数代码(不是我的,来自django书):
def search_page(request):
form = SearchForm()
bookmarks = []
show_results = False
if 'query' in request.GET:
show_results = True
query = request.GET['query'].strip()
if query:
form = SearchForm({'query': query})
bookmarks = Bookmark.objects.filter(title__icontains=query)[:10]
show_tags = True
show_user = True
if request.is_ajax():
return render_to_response("bookmarks/bookmark_list.html", locals(), context_instance=RequestContext(request))
else:
return render_to_response("search/search.html", locals(), context_instance=RequestContext(request))
忽略 ajax 事实(只是暂时让问题更容易),我如何将其转换为基于类的视图?
我很快尝试了这样的事情:
class SearchPageView(FormView):
template_name = 'search/search.html'
def get(self, request, *args, **kwargs):
form = SearchForm()
self.bookmarks = []
self.show_results = False
if 'query' in self.request.GET:
self.show_results = True
query = self.request.GET['query'].strip()
if query:
form = SearchForm({'query': query})
self.bookmarks = Bookmark.objects.filter(title__icontains=query)[:10]
return super(SearchPageView, self).get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(SearchPageView, self).get_context_data(**kwargs)
context.update({
'show_tags': True,
'show_user': True,
'show_results': self.show_results,
'bookmarks': self.bookmarks
})
return context
不起作用,我得到一个:“'NoneType' 对象不可调用”
很公平,我今天从这些东西开始。
那么,有什么方法可以创建一个基于类的视图来管理一个获取(如果需要的话也可以是一个帖子)请求?
我还有一个例子:
@render_to('registration/register.html')
def register_page(request):
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
user = User.objects.create_user(
username=form.cleaned_data['username'],
password=form.cleaned_data['password1'],
email=form.cleaned_data['email']
)
return HttpResponseRedirect('/accounts/register/success/')
else:
form = RegistrationForm()
return locals()
这会以与第一个相同的方式“转换”吗?或者他们扩展了不同的视图?
我很困惑。不知道第一个是ProcessFormView,第二个是FormView还是什么。
谢谢。
编辑: 我的解决方案是:
class SearchPageView(FormView):
template_name = 'search/search.html'
def get(self, request, *args, **kwargs):
self.bookmarks = []
self.show_results = False
form = SearchForm(self.request.GET or None)
if form.is_valid():
self.show_results = True
self.bookmarks = Bookmark.objects.filter(title__icontains=form.cleaned_data['query'])[:10]
return self.render_to_response(self.get_context_data(form=form))
def get_context_data(self, **kwargs):
context = super(SearchPageView, self).get_context_data(**kwargs)
context.update({
'show_tags': True,
'show_user': True,
'show_results': self.show_results,
'bookmarks': self.bookmarks
})
return context
我把这个留给有同样问题的人:)
【问题讨论】:
-
复制和粘贴
'NoneType' object is not callable"不是很有帮助。如果您查看回溯中的行号,您可以看到是哪一行代码引发了异常,这可能有助于您自己修复它。 -
问题更新了,你说得对,我得睡觉了,我想我需要指定我的表单类,是的,你说得对。
标签: django django-class-based-views