Guest User

Untitled

a guest
Nov 21st, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.03 KB | None | 0 0
  1. """ Nuestro Prototipo de formularios:
  2. @template:
  3. - Cuando el pedido es un simple request no ajax, el template siempre es el mismo para cualquier metodo.
  4. - Cuando el pedido es un ajax, esta la chance de poder cambiar el template por el bloque deseado en
  5. cualquier metodo donde entremos, una idea es decorar el metodo when_is_ajax(template="bloque_penca.html")
  6. @Cuando los pedidos son ajax: nuestro dispatch reconoce la situacion y ejecuta el handler especifico de la accion
  7. indicada y ademas va a devolver un json con el atributo html con el cuerpo del response y en el atributo
  8. messages tiene una lista [{'TAG_MESSAGE': MESSAGE}...] donde TAG_MESSAGE puede ser ERROR|SUCCESS|INFO|ETC...
  9. @URL: ..../ACTION/ID{?QUERY_STRING} -> self.kwargs contiene action:ACTION id:ID.
  10. @Los nombres de las acciones deben ser iguales a los nombres de los metodos dentro de la definicion de la clase.
  11. @Metodo especial refresh: Si se escribe un metodo refresh(self, request) el punto de entrada de este es un flag
  12. refresh tanto por GET o POST.
  13. -------- NOTAS: Abajo esta el ultimo form que hicimos con Code-man y saco algunas concluciones. -------
  14. * FRAGMENTO 1: Este fragmento de codigo tiene como objetivo indicar que ese metodo, en este caso save
  15. y puede ser cualquier otro, no tiene sentido si no es ejecutado con un POST. En ese caso concreto de save
  16. redirecciona a edit o create si viene por un GET. Yo pongo un voto para que esto sea un decorador, todos
  17. hacen la misma logica. y propongo el nombre: only_post_method(whitout_id:'ruta', whit_id:'ruta')
  18. * FRAGMENTO 2: Este fragmento de codigo sirve para definir la url del attributo action del formulario.
  19. Yo propongo un metodo que se puede sobreescribir que es get_url_action:
  20.  
  21. class AnyFormView:
  22. template = .....
  23. process_method = 'save' # nombre de la accion encargada de procesar los formularios.
  24. url_name = "url form name" # no se si no se puede tomar directamente de algun lado.
  25. .....
  26.  
  27. # definicion de get_url_action default
  28. def get_url_action(self):
  29. kwargs = {"action": self.process_method}
  30. if self.kwargs.get('id', None):
  31. kwargs.update({'id': self.kwargs['id']})
  32.  
  33. url_action = reverse(self.url_name, kwargs=kwargs)
  34. self.context.update({'url_action': url_action})
  35. """
  36.  
  37. class StoreViewForm(CoreViewForm):
  38. template = "manager/store/store_form.html"
  39.  
  40. def create(self, request):
  41. self.store = Store()
  42. return self.render(request)
  43.  
  44. def edit(self, request):
  45. id = self.kwargs['id']
  46. self.store = Store.objects.with_id(id)
  47. if not self.store:
  48. raise Http404
  49. return self.render(request)
  50.  
  51. def save(self, request):
  52. id = self.kwargs.get('id', None)
  53.  
  54. # FRAGMENTO 1
  55. if request.method == "GET":
  56. if id:
  57. url = reverse(
  58. 'manager.store_form',
  59. kwargs={'action': 'edit', 'id': id}
  60. )
  61. return Redirect(url)
  62. else:
  63. url = reverse(
  64. 'manager.store_form',
  65. kwargs={'action': 'create'}
  66. )
  67. return Redirect(url)
  68. # FIN FRAGMENTO 1
  69.  
  70. self.store = Store.objects.with_id(id) if id else Store()
  71. self.store.populate(self.cleaned_data)
  72. try:
  73. self.store.save()
  74. messages.add_message(
  75. request,
  76. messages.SUCCESS,
  77. _("The store has been saved.")
  78. )
  79. url = reverse(
  80. 'manager.store_form',
  81. kwargs={"action": "edit", "id": self.store.str_id()}
  82. )
  83. return Redirect(url)
  84. except ValidationError, e:
  85. for field, error in e.errors.items():
  86. messages.add_message(request, messages.ERROR, error)
  87. return self.render(request)
  88.  
  89. def render(self, request):
  90. store_locale_choices = filter(
  91. lambda x: x[0] != LOCALE_DEFAULT,
  92. LOCALE_CHOICES
  93. )
  94. store_locale_choices = SelectMultiple().render_options(
  95. store_locale_choices,
  96. selected_choices=[]
  97. )
  98.  
  99. # FRAGMENTO 2
  100. kwargs = {"action": "save"}
  101. if self.kwargs.get('id', None):
  102. kwargs.update({'id': self.kwargs['id']})
  103.  
  104. url_action = reverse(
  105. 'manager.store_form',
  106. kwargs=kwargs
  107. )
  108. self.context.update({'url_action': url_action})
  109. # FIN FRAGMENTO 2
  110.  
  111. self.context.update({'store_locale_choices': store_locale_choices})
  112. self.context.update({'store': getattr(self, 'store', None)})
  113. return render_to_response(
  114. self.template,
  115. self.context,
  116. context_instance=RequestContext(request)
  117. )
Add Comment
Please, Sign In to add comment