我試圖學習基於類的視圖,對於細節或列表視圖並不那麼複雜。如何使用基於類的視圖處理表單(通過get或post)?
我有一個搜索表單,我只是想看看我是否發送一個查詢,以顯示結果。
下面是函數代碼(不是我的,是從一個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’對象不是可調用的」
很公平,我今天開始這個東西。
那麼,什麼是做可以管理一個get(和太多,如果需要後)請求基於類的意見的方式嗎?
我有另外一個例子:
@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()
這會是「轉化」的方式,第一個一樣的嗎?或者他們擴大differents意見?
林混淆了很多。我不知道如果第一個是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'對象不可調用''不是很有用如果您查看回溯行中的行號,您可以看到哪行代碼引發異常,這可能有助於你自己解決問題 – Alasdair 2012-01-18 00:32:31
問題更新了,你是對的,我不得不去睡覺,我認爲我需要指定我的表單類和你是對的, – 2012-01-18 11:29:34