Your SlideShare is downloading. ×
0
django el curso Día 3
<ul><li>Vistas </li></ul><ul><ul><ul><li>Patrones de vistas </li></ul></ul></ul><ul><ul><ul><li>HttpResponse objects </li>...
Vistas <ul><ul><li>Una función “callback” en python asociada a un url. </li></ul></ul><ul><ul><li>Siempre devuelven una in...
# en urls.py (r'^example/project/(?P<project_id>d+)/$', 'example_get_project') # en views.py def  example_get_project (req...
from  django.http  import  HttpResponse, HttpResponseNotFound def  example_get_project (request, project_id): try : p = Pr...
from  django.http  import  HttpResponse, Http404 def  example_get_project (request, project_id): try : p = Project.objects...
def  example_get_project_with_template (request, project_id): try : p = Project.objects.get(pk=project_id) t = loader.get_...
<ul><ul><li>Es la responsabilidad del programador devolver en cada vista un HttpResponse. </li></ul></ul>Vistas <ul><ul><l...
import  csv, StringIO def  _gen(qset): io = StringIO.StringIO() writer = csv.writer(io) writer.writerow(TaskLog.header_row...
Atributos HttpResponse.content Métodos HttpResponse.__init__(content='', mimetype=None, status=200, content_type=DEFAULT_C...
class HttpResponseRedirect class HttpResponsePermanentRedirect class HttpResponseNotModified class HttpResponseBadRequest ...
Vistas <ul><ul><li>Ejercicio: crear una vista que devuelva un CSV con cuantas horas hizo cada usuario por tarea. Algo así:...
Plantillas <ul><li>Documento de texto (python string) del cual podemos generar HTML, CSV, XML, ú otros formatos de texto. ...
In [1]: from django.template import Template # Parsear código de Templates y generar una instancia In [4]: t = Template(&q...
{% extends &quot;base_for_examples.html&quot; %} {% block title %} Un proyecto: {{ project.name }} {% endblock title %} {%...
In [1]: from django.template import Template, Context In [12]: b = { 'apellido' :'Perez', 'ocupacion' : 'astronauta' } In ...
Plantillas <ul><li>add  {{ value|add:&quot;2&quot; }} </li></ul><ul><li>cut </li></ul><ul><li>default </li></ul><ul><li>es...
{% if project_list %} {% for project in project_list %} <li> <a class=&quot;head&quot; href='#'>{{project.name}}</a> <ul> ...
<ul><li>{% cycle 'row1' 'row2' %} </li></ul><ul><li>{% autoescape off %} {{ whatever }} {% autoescape %} </li></ul><ul><li...
<!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;  &quot;http://www.w3.org/TR/html4/loose.dtd&quot;...
{% extends &quot;base_for_examples.html&quot; %} {% block title %} Un proyecto: {{ project.name }} {% endblock title %} {%...
<!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;  &quot;http://www.w3.org/TR/html4/loose.dtd&quot;...
Plantillas <ul><ul><li>Contextos </li></ul></ul>In [23]: c = Context() In [24]: c['foo'] = 'first level' In [25]: c.push()...
Plantillas <ul><ul><li>RequestContext (subclase de Context) </li></ul></ul><ul><ul><ul><li>Toma como un argumento Request ...
Plantillas <ul><li>django.core.context_processors.auth </li></ul><ul><ul><li>Agrega permisos {{perms}}, usuario {{ user }}...
Plantillas TEMPLATE_CONTEXT_PROCESSORS = ( &quot;django.core.context_processors.auth&quot;, &quot;django.core.context_proc...
def some_view(request): # ... return render_to_response( 'my_template.html', my_data_dictionary,   context_instance=Reques...
Plantillas <ul><ul><li>Ejercicio: Crear vistas y plantillas para ver los detalles de un proyecto. Los proyectos se deben l...
Managers <ul><li>Interfaz que provee las operaciones de consulta a la base de datos  </li></ul>In [1]: from timetracker.mo...
Managers <ul><li>objects  puede ser renombrado en cada modelo  </li></ul>from django.db import models class TimeTrackerBas...
Managers <ul><li>Se pueden usar Manager modificados extendiendo la clase Manager é instanciando en el modelo. </li></ul><u...
Managers <ul><li>Agregar nuevos métodos. </li></ul>class  TaskManager (models.Manager): def  admin_task_count( self ): fro...
Managers <ul><li>Agregar nuevos métodos. </li></ul>In [2]: from timetracker.models import Task In [3]: Task.tasks.all() Ou...
Managers class  UncompletedTaskManager (models.Manager): def  get_query_set(self): return   super (UncompletedTaskManager,...
Managers In [1]: from timetracker.models import Task In [2]: Task.uncompleted_tasks.all() Out[2]: [<Task: crear algunas vi...
Managers <ul><ul><li>Managers que estén definidos en clases no abstractas no se heredan. Se supone que en general los mana...
Un poco de AJAX y un poco de Serialización
AJAX <ul><li>Utilizamos un framework: jQuery </li></ul><ul><li>Asynchronous Javascript and XML </li></ul><ul><li>urlpatter...
AJAX <ul><li>Ejemplo: buscar html generado por una vista </li></ul>{% block script %} function get_project_tasks(url) { $....
AJAX def example_ajax_get_task_for_project (request, project_id): if request.method == 'GET': p = get_object_or_404(Projec...
Serialización In [11]: from django.core import serializers In [12]: data=serializers.serialize(&quot;xml&quot;,Project.obj...
Serialización <ul><li>se pueden salvar objetos 'deserializados' </li></ul><ul><li>se puede serializar a un archivo </li></...
AJAX y Serialización <ul><ul><li>Ejercicio: crear una vista serialize los TaskLog y los muestre cada vez que se pidan util...
This work is licensed under the Creative Commons Attribution-Noncommercial-Share Alike 2.5 Argentina License. To view a co...
Upcoming SlideShare
Loading in...5
×

Curso de Django | Django Course

2,461

Published on

Django course given while working at Except. In spanish.

Published in: Technology
1 Comment
2 Likes
Statistics
Notes
No Downloads
Views
Total Views
2,461
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
76
Comments
1
Likes
2
Embeds 0
No embeds

No notes for slide

Transcript of "Curso de Django | Django Course"

  1. 1. django el curso Día 3
  2. 2. <ul><li>Vistas </li></ul><ul><ul><ul><li>Patrones de vistas </li></ul></ul></ul><ul><ul><ul><li>HttpResponse objects </li></ul></ul></ul><ul><li>Plantillas </li></ul><ul><ul><ul><li>lenguaje </li></ul></ul></ul><ul><ul><ul><li>RequestContext y Contextos </li></ul></ul></ul><ul><li>Managers </li></ul><ul><ul><ul><li>agregar funcionalidad </li></ul></ul></ul><ul><ul><ul><li>modificar queryset inicial </li></ul></ul></ul><ul><li>AJAX y Serialización </li></ul>Temario
  3. 3. Vistas <ul><ul><li>Una función “callback” en python asociada a un url. </li></ul></ul><ul><ul><li>Siempre devuelven una instancia HttpResponse o una subclase de HttpResponse. </li></ul></ul><ul><ul><li>Respuesta puede ser: contenidos html, redirección, 404, xml, etc. </li></ul></ul><ul><ul><li>Pueden “vivir” en cualquier lado, pero tienen que estar en el PythonPath. </li></ul></ul>
  4. 4. # en urls.py (r'^example/project/(?P<project_id>d+)/$', 'example_get_project') # en views.py def example_get_project (request, project_id): try: p = Project.objects.get(project__pk=project_id) # pk synonym of id html = ( &quot;<html> <body>&quot; &quot;<p> Project Name: %s </p>&quot; &quot;<p> Project Description: %s </p>&quot; &quot;</body> </html>&quot; ) % (p.name, p.description) except Project.DoesNotExist: html = &quot;<html> <body> <p> <b> Bu! :-( No existe! <b> <p> </body> <html>&quot; return HttpResponse(html) Vistas
  5. 5. from django.http import HttpResponse, HttpResponseNotFound def example_get_project (request, project_id): try : p = Project.objects.get(project__pk=project_id) # pk synonym of id html = ( &quot;<html> <body>&quot; &quot;<p> Project Name: %s </p>&quot; &quot;<p> Project Description: %s </p>&quot; &quot;</body> </html>&quot; ) % (p.name, p.description) return HttpResponse(html) except Project.DoesNotExist: html = &quot;<html> <body> <p> <b>&quot; &quot;Bu! :-( No existe!&quot; &quot;<b> <p> </body> <html>&quot; return HttpResponseNotFound(html ) Vistas
  6. 6. from django.http import HttpResponse, Http404 def example_get_project (request, project_id): try : p = Project.objects.get(project__pk=project_id) # pk synonym of id html = ( &quot;<html> <body>&quot; &quot;<p> Project Name: %s </p>&quot; &quot;<p> Project Description: %s </p>&quot; &quot;</body> </html>&quot; ) % (p.name, p.description) return HttpResponse(html) except Project.DoesNotExist: raise Http404 <ul><ul><li>404 común, buena idea tener una página de error estándar. </li></ul></ul>Vistas
  7. 7. def example_get_project_with_template (request, project_id): try : p = Project.objects.get(pk=project_id) t = loader.get_template('project_details.html') c = Context({'project': p}) r = HttpResponse(t.render(c), mimetype=&quot;application/xhtml+xml&quot;) return r except Project.DoesNotExist: raise Http404 def example_get_project_with_get_object (request, project_id) p = get_object_or_404(Project, pk=project_id) return render_to_response('project_details', { 'project' : p }) <ul><ul><li>funciones que se extienden a través de varias capas </li></ul></ul><ul><ul><li>utilizando plantillas </li></ul></ul>Vistas
  8. 8. <ul><ul><li>Es la responsabilidad del programador devolver en cada vista un HttpResponse. </li></ul></ul>Vistas <ul><ul><li>Se puede utilizar como un archivo... </li></ul></ul>In [1]: from django.http import HttpResponse In [2]: response = HttpResponse() In [3]: response.write(&quot;<p>Here's the text of the Web page.</p>&quot;) <ul><ul><li>Se pueden modificar los headers... </li></ul></ul>In [5]: response['X-DJANGO'] = 'It is the best' In [6]: response['X-DJANGO'] Out[6]: 'It is the best' <ul><ul><li>Se pueden pasar iteradores, que devuelvan strings. Si se inicializo con un iterador, no se puede usar como un archivo. </li></ul></ul>
  9. 9. import csv, StringIO def _gen(qset): io = StringIO.StringIO() writer = csv.writer(io) writer.writerow(TaskLog.header_row) # Add header yield io.getvalue() for item in qset: io = StringIO.StringIO() writer = csv.writer(io) writer.writerow(item.get_csv_row()) yield io.getvalue() return def csv_log(request, project_id, username): ... response = HttpResponse(_gen(queryset), mimetype='text/csv') response[ 'Content-Disposition' ] = ( 'attachment; filename=' 'tasklogs' '-for-%s.csv' ) % username return response
  10. 10. Atributos HttpResponse.content Métodos HttpResponse.__init__(content='', mimetype=None, status=200, content_type=DEFAULT_CONTENT_TYPE) HttpResponse.__setitem__(header, value) HttpResponse.__delitem__(header) HttpResponse.__getitem__(header) HttpResponse.has_header(header) HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None) HttpResponse.delete_cookie(key, path='/', domain=None) HttpResponse.write(content) HttpResponse.flush() HttpResponse.tell()
  11. 11. class HttpResponseRedirect class HttpResponsePermanentRedirect class HttpResponseNotModified class HttpResponseBadRequest class HttpResponseNotFound class HttpResponseForbidden class HttpResponseNotAllowed class HttpResponseGone class HttpResponseServerError
  12. 12. Vistas <ul><ul><li>Ejercicio: crear una vista que devuelva un CSV con cuantas horas hizo cada usuario por tarea. Algo así: 'Usuario', 'Tarea', 'Horas' </li></ul></ul>
  13. 13. Plantillas <ul><li>Documento de texto (python string) del cual podemos generar HTML, CSV, XML, ú otros formatos de texto. </li></ul><ul><li>Lenguaje, con variables, etiquetas (tags) y filtros (filters) </li></ul><ul><li>variables son remplazadas por valores </li></ul><ul><li>las etiquetas nos permiten controlar la logica de las plantillas </li></ul><ul><li>filtros permiten modificar el valor de las variables </li></ul>
  14. 14. In [1]: from django.template import Template # Parsear código de Templates y generar una instancia In [4]: t = Template(&quot;Hello, {{ name }}&quot;) In [6]: print t <django.template.Template object at 0x87c7aec> In [8]: from django.template import Context # Una vez compilada podemos renderizar con un contexto In [9]: c = Context({'name' : 'World'}) In [10]: t.render(c) Out[10]: u'Hello, World' Plantillas
  15. 15. {% extends &quot;base_for_examples.html&quot; %} {% block title %} Un proyecto: {{ project.name }} {% endblock title %} {% block content %} <p> <b> Un proyecto: </b> </p> <hr/> <p> Nombre: {{ project.name|upper }} </p> <p> Descripción: {{ project.description|truncatewords:&quot;10&quot; }} </p> {% endblock content %} Variable, el punto (.) se accede a los atributos de la variable, diccionario, llamada a una función sin arg. Etiqueta que define un bloque que se puede sobre escribir. Herencia. Filtro, módifica el string, letras mayúsculas Indica de que template hereda Plantillas TEMPLATE_STRING_IF_INVALID
  16. 16. In [1]: from django.template import Template, Context In [12]: b = { 'apellido' :'Perez', 'ocupacion' : 'astronauta' } In [13]: t = Template('Yo me llamo {{ dict.apellido }} y soy {{ dict.ocupacion }}') In [14]: c = Context({'dict' : b}) In [15]: t.render(c) Out[15]: u'Yo me llamo Perez y soy astronauta' In [16]: t = Template('Yo me llamo {{ dict.apellido|upper }} y soy {{ dict.ocupacion }}') In [17]: t.render(c) Out[17]: u'Yo me llamo PEREZ y soy astronauta' <ul><li>Varios filtros definidos, y se pueden definir propios </li></ul>Plantillas
  17. 17. Plantillas <ul><li>add {{ value|add:&quot;2&quot; }} </li></ul><ul><li>cut </li></ul><ul><li>default </li></ul><ul><li>escape </li></ul><ul><li>floatformat 34.23234,{{ value|floatformat }},34.2 </li></ul><ul><li>length </li></ul><ul><li>safe </li></ul><ul><li>slugify </li></ul>
  18. 18. {% if project_list %} {% for project in project_list %} <li> <a class=&quot;head&quot; href='#'>{{project.name}}</a> <ul> {% for task in project.task_set.all %} <li> <a href=&quot;#&quot; onclick=&quot;retrieve_tasklogs({{ task.id }})&quot;> {{ task.name }} </a> </li> {% endfor %} </ul> </li> {% endfor %} {% else %} <li> <a class=&quot;head&quot; href='#'> No projects in database </a> Please add some projects in the database </li> {% endif %} Plantillas
  19. 19. <ul><li>{% cycle 'row1' 'row2' %} </li></ul><ul><li>{% autoescape off %} {{ whatever }} {% autoescape %} </li></ul><ul><li>{# comment #} </li></ul><ul><li>{% ifequal user.id comment.user_id %} .. {% endifequal %} </li></ul><ul><li>{% include &quot;foo/bar.html&quot; %} </li></ul><ul><li>{% load %} </li></ul><ul><li>{% url path.to.some_view arg1,arg2,name1=value1 %} </li></ul><ul><li>{% with %} </li></ul><ul><li>http://docs.djangoproject.com/en/dev/ref/templates/builtins/ </li></ul>Plantillas
  20. 20. <!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;> <html> <head> {% block title %} Titulo {% endblock title %} </head> <body> {% block content %} Aquí el contenido de la página {% endblock content %} </body> </html> Plantillas <ul><li>Herencia / Extensión </li></ul>
  21. 21. {% extends &quot;base_for_examples.html&quot; %} {% block title %} Un proyecto: {{ project.name }} {% endblock title %} {% block content %} {% block.super %} <p> <b> Un proyecto: </b> </p> <hr/> <p> Nombre: {{ project.name|upper }} </p> <p> Descripción: {{ project.description|truncatewords:&quot;10&quot; }} </p> {% endblock content %} Plantillas
  22. 22. <!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;> <html> <head> <title> Un proyecto: Curso Django </title> </head> <body> Pagina de la Aplicación: TimeTracker <p> <b> Un proyecto: </b> </p> <hr/> <p> Nombre: CURSO DJANGO </p> <p> Descripción: curso, curso, curse! </p> </body> </html> Plantillas <ul><li>http://localhost:8000/timetracker/example/project-with-shortcuts/1/ </li></ul>
  23. 23. Plantillas <ul><ul><li>Contextos </li></ul></ul>In [23]: c = Context() In [24]: c['foo'] = 'first level' In [25]: c.push() Out[25]: {} In [26]: c['foo'] = 'second level' In [27]: c['foo'] Out[27]: 'second level' In [28]: c Out[28]: [{'foo': 'second level'}, {'foo': 'first level'}] In [29]: c.pop() Out[29]: {'foo': 'second level'} In [30]: c['foo'] Out[30]: 'first level' In [31]: c.pop() ----------------------------------------------------- <class 'django.template.context.ContextPopException'>
  24. 24. Plantillas <ul><ul><li>RequestContext (subclase de Context) </li></ul></ul><ul><ul><ul><li>Toma como un argumento Request </li></ul></ul></ul><ul><ul><ul><li>Agrega variables al contexto según los “Preprocesadores del Contexto” indicados por TEMPLATE_CONTEXT_PROCESSORS. </li></ul></ul></ul><ul><ul><ul><li>Se le pueden agregar preprocesadores al instanciarlos </li></ul></ul></ul>def ip_address_processor(request): return {'ip_address': request.META['REMOTE_ADDR']} def some_view(request): # ... c = RequestContext(request, {'foo': 'bar',}, [ip_address_processor]) return t.render(c)
  25. 25. Plantillas <ul><li>django.core.context_processors.auth </li></ul><ul><ul><li>Agrega permisos {{perms}}, usuario {{ user }} </li></ul></ul><ul><li>django.core.context_processors.debug </li></ul><ul><ul><li>Información de Debug {{ sql_queries }}, {{ debug }} </li></ul></ul><ul><li>django.core.context_processors.i18n </li></ul><ul><ul><li>{{ LANGUAGES }}, {{ LANGUAGE_CODE }} </li></ul></ul><ul><li>django.core.context_processors.media </li></ul><ul><li>django.core.context_processors.request </li></ul><ul><li>crear un propio: </li></ul><ul><ul><li>función python, toma un argumento, devuelve un dict </li></ul></ul>
  26. 26. Plantillas TEMPLATE_CONTEXT_PROCESSORS = ( &quot;django.core.context_processors.auth&quot;, &quot;django.core.context_processors.debug&quot;, &quot;django.core.context_processors.i18n&quot;, &quot;django.core.context_processors.media&quot;, &quot;timetracker.views.add_next_url&quot;, ) # --- request preprocessor / en views def add_next_url (request): return { 'next_url' : request.GET.get('next', None) } <ul><ul><li>Ejemplo </li></ul></ul>
  27. 27. def some_view(request): # ... return render_to_response( 'my_template.html', my_data_dictionary, context_instance=RequestContext(request) ) Plantillas <ul><ul><li>Pasando un instancia de contexto </li></ul></ul>
  28. 28. Plantillas <ul><ul><li>Ejercicio: Crear vistas y plantillas para ver los detalles de un proyecto. Los proyectos se deben listar como tabla y cada se deben diferenciar las filas impares de las pares con algún color. </li></ul></ul>
  29. 29. Managers <ul><li>Interfaz que provee las operaciones de consulta a la base de datos </li></ul>In [1]: from timetracker.models import Project In [2]: Project.objects.all() Out[2]: [<Project: Curso Django>, <Project: Eff>] In [5]: Project.objects.filter(name='Curso Django') Out[5]: [<Project: Curso Django>]
  30. 30. Managers <ul><li>objects puede ser renombrado en cada modelo </li></ul>from django.db import models class TimeTrackerBaseModel (models.Model): ... class Task (TimeTrackerBaseModel): ... tasks = models.Manager() In [7]: from timetracker.models import Task In [8]: Task.objects.all() ... <type 'exceptions.AttributeError'>: type object 'Task' has no attribute 'objects' In [9]: Task.tasks.all() Out[9]: [<Task: edit templates, test and fix views>, <Task: crear algunas vistas>]
  31. 31. Managers <ul><li>Se pueden usar Manager modificados extendiendo la clase Manager é instanciando en el modelo. </li></ul><ul><li>Nota: Es el método sugerido para agregar funcionalidad a nivel de las tablas. </li></ul><ul><li>Agregar nuevos métodos. </li></ul><ul><li>Modificar el QuerySet inicial de los Managers </li></ul>
  32. 32. Managers <ul><li>Agregar nuevos métodos. </li></ul>class TaskManager (models.Manager): def admin_task_count( self ): from django.db import connection cursor = connection.cursor() cursor.execute( &quot;&quot;&quot; SELECT COUNT(*) FROM timetracker_task WHERE timetracker_task.owner_id = 1; &quot;&quot;&quot; ) return cursor.fetchall()[0][0] def query_admin_task_count( self ): return self .filter(owner__username='admin').count() class Task (TimeTrackerBaseModel): ... tasks = TaskManager()
  33. 33. Managers <ul><li>Agregar nuevos métodos. </li></ul>In [2]: from timetracker.models import Task In [3]: Task.tasks.all() Out[3]: [<Task: edit templates, test and fix views>, <Task: crear algunas vistas>] In [4]: Task.tasks.admin_task_count() Out[4]: 2 In [5]: Task.tasks.query_admin_task_count() Out[5]: 2
  34. 34. Managers class UncompletedTaskManager (models.Manager): def get_query_set(self): return super (UncompletedTaskManager, self ) .get_query_set().exclude(state=30) class CompletedTaskManager (models.Manager): def get_query_set(self): return super (CompletedTaskManager, self ) .get_query_set().filter(state=30) # Importante el primer Manager que Django encuentra es el # default class Task (TimeTrackerBaseModel): ... tasks = TaskManager() uncompleted_tasks = UncompletedTaskManager() completed_tasks = CompletedTaskManager() <ul><ul><li>Modificar el QuerySet inicial de los Managers </li></ul></ul>
  35. 35. Managers In [1]: from timetracker.models import Task In [2]: Task.uncompleted_tasks.all() Out[2]: [<Task: crear algunas vistas>] In [3]: Task.completed_tasks.all() Out[3]: [<Task: edit templates, test and fix views>] In [4]: Task.tasks.all() Out[4]: [<Task: edit templates, test and fix views>, <Task: crear algunas vistas>] <ul><ul><li>Modificar el QuerySet inicial de los Managers </li></ul></ul><ul><ul><li>Ejercicio: crear/editar un Manager con una función que devuelve el promedio de horas para cada usuario </li></ul></ul>
  36. 36. Managers <ul><ul><li>Managers que estén definidos en clases no abstractas no se heredan. Se supone que en general los managers son particulares para la clase. </li></ul></ul><ul><ul><li>Managers definidos en una clase abstracta se heredan. </li></ul></ul><ul><ul><li>El default Manager es el primero que está definido en la clase, si no, el primero en la clase abstracta, si no Django genera uno. </li></ul></ul><ul><ul><li>use_for_related_fields = True , dentro de la clase del Manager, indica que use el Manager para obj. relacionados. </li></ul></ul>
  37. 37. Un poco de AJAX y un poco de Serialización
  38. 38. AJAX <ul><li>Utilizamos un framework: jQuery </li></ul><ul><li>Asynchronous Javascript and XML </li></ul><ul><li>urlpatterns += patterns('', (r'^resources/(?P<path>.*)$', 'django.views.static.serve', dict(document_root=media_root, show_indexes=True)), ) </li></ul><ul><li>Necesitamos servir javascript. </li></ul>
  39. 39. AJAX <ul><li>Ejemplo: buscar html generado por una vista </li></ul>{% block script %} function get_project_tasks(url) { $.ajax({ type: &quot;GET&quot;, url: url, dataType: &quot;html&quot;, success: function(html){ $(&quot;#id_tasks_set&quot;).empty().append(html); } }); } {% endblock script %} <!-- En la platilla base --> <script type=&quot;text/javascript&quot; src=&quot;/timetracker/resources/js/jquery.js&quot;> </script>
  40. 40. AJAX def example_ajax_get_task_for_project (request, project_id): if request.method == 'GET': p = get_object_or_404(Project, pk=project_id) tasks = p.task_set.all() if request.is_ajax(): # HTTP_X_REQUESTED_WITH # with string 'XMLHttpRequest' return render_to_response('task_details_ajax.html', { 'tasks' : tasks }) else: return render_to_response('project_with_tasks_details.html', { 'project' : p, 'tasks' : tasks }) <!-- La plantilla --> <ul> {% for task in tasks %} <li> Nombre: {{ task.name }} </li> <li> Descripción: {{ task.description }} </li> <li> Fecha de Inicio: {{ task.start_date }} </li> <!-- plin, plin, plin .. --> {% endfor %} <ul>
  41. 41. Serialización In [11]: from django.core import serializers In [12]: data=serializers.serialize(&quot;xml&quot;,Project.objects.filter(pk=1), fields=('name',)) In [17]: data Out[17]: '<?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> <django-objects version=&quot;1.0&quot;><object pk=&quot;1&quot; model=&quot;timetracker.project&quot;><field type=&quot;CharField&quot; name=&quot;name&quot;>Curso Django</field></object></django-objects> In [18]: for obj in serializers.deserialize(&quot;xml&quot;, data): ....: print obj, type(obj) ....: ....: <DeserializedObject: Curso Django> <class 'django.core.serializers.base.DeserializedObject'>
  42. 42. Serialización <ul><li>se pueden salvar objetos 'deserializados' </li></ul><ul><li>se puede serializar a un archivo </li></ul><ul><li>se pueden instanciar... </li></ul>out = open(&quot;file.xml&quot;, &quot;w&quot;) xml_serializer.serialize(SomeModel.objects.all(), stream=out) XMLSerializer = serializers.get_serializer(&quot;xml&quot;) xml_serializer = XMLSerializer() xml_serializer.serialize(queryset) data = xml_serializer.getvalue() for deserialized_object in serializers.deserialize(&quot;xml&quot;, data): if object_should_be_saved(deserialized_object): deserialized_object.save()
  43. 43. AJAX y Serialización <ul><ul><li>Ejercicio: crear una vista serialize los TaskLog y los muestre cada vez que se pidan utilizando AJAX </li></ul></ul>json_serializer = serializers.get_serializer(&quot;json&quot;)() json_serializer.serialize(queryset, ensure_ascii=False, stream=response)
  44. 44. This work is licensed under the Creative Commons Attribution-Noncommercial-Share Alike 2.5 Argentina License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/ar/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×