Im intentando aprender vistas basadas en clases, para una vista detallada o de lista no es tan complicado.¿Cómo procesar un formulario (a través de get o post) usando vistas basadas en clases?
Tengo un formulario de búsqueda y solo quiero ver si envío una consulta para mostrar los resultados.
Aquí está el código de función (no es mío, es de un libro de 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))
Ignorando el hecho de Ajax (sólo para simplificar el problema por ahora), ¿cómo puedo traducir esto a la clase ¿puntos de vista basados?
rápida que hemos probado algo como esto:
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
no funciona, me sale un "objeto 'NoneType' no es exigible"
Justo lo suficiente, empecé hoy con estas cosas.
Entonces, ¿cuál es la manera de hacer una vista basada en clase que pueda administrar una solicitud get (y una publicación también si es necesario)?
tengo otro ejemplo:
@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()
sería esto "transformado" de la misma manera que la primera? O extienden diferentes Vistas?
Im confundido mucho. No sé si el primero es ProcessFormView y el segundo FormView o qué.
Gracias.
EDIT: Solución terminé con:
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
dejo esto aquí a alguien con la misma pregunta :)
Copiar y pegar El objeto "NoneType" no se puede llamar "' no es muy útil. Si observa el número de línea en el rastreo, puede ver qué línea de código arroja la excepción, lo que podría ayudar para arreglarlo tú mismo. – Alasdair
Pregunta actualizada, tenías razón, tenía que irme a la cama y pensé que necesitaba especificar mi clase de formulario y sí, tenías razón. –