詳細またはリストビューはそれほど複雑ではないため、クラスベースのビューを学習しようとしています。
検索フォームがあり、クエリを送信して結果を表示するかどうかを確認したいだけです。
関数コードは次のとおりです(私のものではなく、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 で 2 番目が 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
これは、同じ質問を持つ人に任せます:)