Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """ Nuestro Prototipo de formularios:
- @template:
- - Cuando el pedido es un simple request no ajax, el template siempre es el mismo para cualquier metodo.
- - Cuando el pedido es un ajax, esta la chance de poder cambiar el template por el bloque deseado en
- cualquier metodo donde entremos, una idea es decorar el metodo when_is_ajax(template="bloque_penca.html")
- @Cuando los pedidos son ajax: nuestro dispatch reconoce la situacion y ejecuta el handler especifico de la accion
- indicada y ademas va a devolver un json con el atributo html con el cuerpo del response y en el atributo
- messages tiene una lista [{'TAG_MESSAGE': MESSAGE}...] donde TAG_MESSAGE puede ser ERROR|SUCCESS|INFO|ETC...
- @URL: ..../ACTION/ID{?QUERY_STRING} -> self.kwargs contiene action:ACTION id:ID.
- @Los nombres de las acciones deben ser iguales a los nombres de los metodos dentro de la definicion de la clase.
- @Metodo especial refresh: Si se escribe un metodo refresh(self, request) el punto de entrada de este es un flag
- refresh tanto por GET o POST.
- -------- NOTAS: Abajo esta el ultimo form que hicimos con Code-man y saco algunas concluciones. -------
- * FRAGMENTO 1: Este fragmento de codigo tiene como objetivo indicar que ese metodo, en este caso save
- y puede ser cualquier otro, no tiene sentido si no es ejecutado con un POST. En ese caso concreto de save
- redirecciona a edit o create si viene por un GET. Yo pongo un voto para que esto sea un decorador, todos
- hacen la misma logica. y propongo el nombre: only_post_method(whitout_id:'ruta', whit_id:'ruta')
- * FRAGMENTO 2: Este fragmento de codigo sirve para definir la url del attributo action del formulario.
- Yo propongo un metodo que se puede sobreescribir que es get_url_action:
- class AnyFormView:
- template = .....
- process_method = 'save' # nombre de la accion encargada de procesar los formularios.
- url_name = "url form name" # no se si no se puede tomar directamente de algun lado.
- .....
- # definicion de get_url_action default
- def get_url_action(self):
- kwargs = {"action": self.process_method}
- if self.kwargs.get('id', None):
- kwargs.update({'id': self.kwargs['id']})
- url_action = reverse(self.url_name, kwargs=kwargs)
- self.context.update({'url_action': url_action})
- """
- class StoreViewForm(CoreViewForm):
- template = "manager/store/store_form.html"
- def create(self, request):
- self.store = Store()
- return self.render(request)
- def edit(self, request):
- id = self.kwargs['id']
- self.store = Store.objects.with_id(id)
- if not self.store:
- raise Http404
- return self.render(request)
- def save(self, request):
- id = self.kwargs.get('id', None)
- # FRAGMENTO 1
- if request.method == "GET":
- if id:
- url = reverse(
- 'manager.store_form',
- kwargs={'action': 'edit', 'id': id}
- )
- return Redirect(url)
- else:
- url = reverse(
- 'manager.store_form',
- kwargs={'action': 'create'}
- )
- return Redirect(url)
- # FIN FRAGMENTO 1
- self.store = Store.objects.with_id(id) if id else Store()
- self.store.populate(self.cleaned_data)
- try:
- self.store.save()
- messages.add_message(
- request,
- messages.SUCCESS,
- _("The store has been saved.")
- )
- url = reverse(
- 'manager.store_form',
- kwargs={"action": "edit", "id": self.store.str_id()}
- )
- return Redirect(url)
- except ValidationError, e:
- for field, error in e.errors.items():
- messages.add_message(request, messages.ERROR, error)
- return self.render(request)
- def render(self, request):
- store_locale_choices = filter(
- lambda x: x[0] != LOCALE_DEFAULT,
- LOCALE_CHOICES
- )
- store_locale_choices = SelectMultiple().render_options(
- store_locale_choices,
- selected_choices=[]
- )
- # FRAGMENTO 2
- kwargs = {"action": "save"}
- if self.kwargs.get('id', None):
- kwargs.update({'id': self.kwargs['id']})
- url_action = reverse(
- 'manager.store_form',
- kwargs=kwargs
- )
- self.context.update({'url_action': url_action})
- # FIN FRAGMENTO 2
- self.context.update({'store_locale_choices': store_locale_choices})
- self.context.update({'store': getattr(self, 'store', None)})
- return render_to_response(
- self.template,
- self.context,
- context_instance=RequestContext(request)
- )
Add Comment
Please, Sign In to add comment