source: sapic/curso_django/curso_django.tex @ 6f93ab7

erwinexplicacion_situacional
Last change on this file since 6f93ab7 was 6f93ab7, checked in by edgoldo <edgetrono@…>, 7 años ago

Recuperación de archivo

  • Propiedad mode establecida a 100644
File size: 28.7 KB
Línea 
1\documentclass[xcolor=dvipsnames]{beamer}
22       \usetheme{Berkeley}
33       \usepackage[spanish]{babel}
44       \usepackage[utf8]{inputenc}
55       \usepackage[T1]{fontenc}
66       \usepackage{lmodern}
77       \usepackage{fancyhdr}
88       \usepackage{graphicx}
99       \usepackage{mathrsfs}
1010      \usepackage{amsmath}
1111      \usepackage{lmodern}
1212      \usepackage{multimedia}
1313      \usepackage{hyperref}
1414      \usepackage{varioref}
1515      \usepackage{ragged2e}
1616      \usepackage{etoolbox}
1717      \usepackage{lipsum}
1818      \usepackage{fancyvrb}
1919      \fvset{fontsize=\footnotesize}
2020      \RecustomVerbatimEnvironment{verbatim}{Verbatim}{}
2121      \apptocmd{\frame}{}{\justifying}{} % Allow optional arguments after frame.
2222      \usecolortheme[{rgb={0.6,0,0}}]{structure}
2323      \setbeamercovered{transparent}
2424      \setbeamertemplate{items}[ball]
2525      \setbeamertemplate{blocks}[rounded][shadow=true]
2626      \beamertemplateshadingbackground{gray!50}{white!50}
2727      \newtheorem{Ejemplo}{Django}
2828      \useoutertheme{infolines}
2929      \title []{Framework Django 1.11}
3030      \author{Instructor Ing. Erwin Paredes}
3131      %\logo{ \includegraphics[height=3cm]{figura/logo-blanco2.png}}
3232      \institute{CENDITEL}
3333      \date{\today}
3434     
3535      \begin{document}
3636     
3737      \section{Cenditel}
3838      \begin{frame}
3939      \maketitle
4040      \end{frame}
4141     
4242      \subsection{La Fundación}
4343      \begin{frame}
4444      \begin{block}{Fundación CENDITEL}
4545      \indent   
4646      Somos el Centro Nacional de Desarrollo e Investigación en Tecnologías Libres, cuyas actividades son el desarrollo de proyectos con impacto tecnológico enmarcados en las áreas de Software, Hardware y Telecomunicaciones.
4747      https://www.cenditel.gob.ve
4848     
4949      \end{block}
5050      \end{frame}
5151     
5252      \subsection{Finalidad del Curso}
5353      \begin{frame}
5454      \begin{block}{Finalidad}
5555           
5656      Consolidar la comunidad de desarrollo en software libre alrededor de la tecnología, en este caso el framework de desarrollo Django del lenguaje de programación Python
5757      \end{block}
5858      \end{frame}
5959     
6060      \subsection{Contenido del Curso}
6161      \begin{frame}
6262      \begin{block}{Contenido del Curso}
6363      \begin{itemize}
6464      \item 
6565      Introducción
6666      \item 
6767      Configurar ambiente de trabajo
6868      \item 
6969      Crear proyecto
7070      \item 
7171      Crear aplicaciones y estructura del proyecto
7272      \item 
7373      Modelos y migraciones
7474      \item 
7575      Relaciones
7676      \item 
7777      Django shell y Querysets
7878      \item 
7979      Configurar URLs y primera views
8080      \item 
8181      Sistema de plantillas
8282      \item 
8383      Configurar archivos estáticos
8484      \item 
8585      Listar Registros
8686      \item 
8787      Formularios y vista para anexar registros
8888      \item 
8989      Vistas para modificar y eliminar registros
9090      \end{itemize}
9191      \end{block}
9292      \end{frame}
9393     
9494     
9595      \begin{frame}
9696      \begin{block}{Contenido del Curso}
9797      \begin{itemize}
9898      \item
9999      ListView, CreateView, UpdateView, DeleteView   
100100     \item
101101     Crear Login
102102     \item
103103     Registro de Usuarios
104104     \item
105105     Decorador Login required
106106     \item
107107     Recuperar contraseña por correo
108108     \item
109109     Introducción a conceptos avanzados
110110     \end{itemize}
111111     \end{block}
112112     \end{frame}
113113     
114114     
115115     
116116     \section{Django}
117117     \subsection{Introducción}
118118     \begin{frame}
119119     Django: Es un entorno de trabajo para el desarrollo Web, basado en el lenguaje de programación Python.
120120     
121121     Un entorno de trabajo o framework, implica una estructura conceptual y conjunto de herramientas que típicamente son un conjunto de librerías, que permite organizar el desarrollo.
122122     
123123     Para el framework Django la estructura conceptual es el denominado MVC (Modelo Vista Controlador), esto es, se organiza el desarrollo en módulos que separan el modelo de datos, la interfaz o vista y el comportamiento.
124124     
125125     Por lo que para cada aplicación o módulo que conforma el proyecto se agrupa en lo siguientes archivos:
126126     
127127     \begin{itemize}
128128      \item models.py :Contiene las clases que definen la estructura de datos
129129      \item views.py  :Contiene la codificación de las funcionalidades que permiten controlar el comportamiento del sistema.
130130      \item *.html    :Contiene la codificación de la interfaz
131131     \end{itemize}
132132     \end{frame}
133133     
134134     \subsection{Configurar ambiente de trabajo}
135135     \begin{frame}[fragile]
136136     
137137     \begin{Large}\textbf{Sitio Oficial}\end{Large}
138138     \begin{verbatim}
139139     
140140     https://www.djangoproject.com/
141141     
142142     Instalación
143143     
144144     https://docs.djangoproject.com/en/1.11/intro/install
145145     
146146     Descarga:
147147     
148148     https://www.djangoproject.com/download/
149149     \end{verbatim}
150150     \end{frame}
151151     
152152     \begin{frame}[fragile]
153153     
154154     \begin{Large}\textbf{Instalación}\end{Large}
155155     \begin{verbatim}
156156     // Descomprimir el archivo
157157     
158158     tar -xzvf Django1.11.tar.gz
159159     
160160     cd Django1.11
161161     
162162     python setup.py install
163163     
164164     // Comprobar la instalación del framework:
165165     
166166     python
167167     import django
168168     django.VERSION
169169     
170170     Ctrl + D
171171     \end{verbatim}
172172     \end{frame}
173173     
174174     \subsection{Crear proyecto}
175175     \begin{frame}[fragile]
176176     
177177     \begin{verbatim}
178178     // Crear el primer proyecto:
179179     
180180     django-admin startproject curso
181181     
182182     // este comando crea la siguiente infraestructura
183183     de carpetas y archivos:
184184     
185185     curso/
186186         manage.py
187187         curso/
188188             __init__.py
189189             settings.py
190190             urls.py
191191             wsgi.py
192192     
193193     
194194     Configurar la base de datos
195195     
196196     \end{verbatim}
197197     \end{frame}
198198     
199199     \begin{frame}[fragile]
200200     
201201     \begin{verbatim}
202202     // Se debe haber instalado el gestor de la Base de
203203     Datos Postgresql  y la librería de conexión psycopg2
204204     // Creamos la base de datos:
205205     su postgres
206206     psql
207207     CREATE USER administrador;
208208     CREATE DATABASE curso;
209209     
210210     // Se edita el archivo curso/settings.py la constante
211211     DATABASES = {
212212        'default': {
213213             'ENGINE': 'django.db.backends.postgresql',
214214             'NAME': 'curso',
215215             'USER': 'administrador',
216216             'PASSWORD': 'clave',
217217             'HOST': '127.0.0.1',
218218             'PORT': '5432',
219219       } }
220220     \end{verbatim}
221221     \end{frame}
222222     
223223     \begin{frame}[fragile]
224224     \begin{verbatim}
225225     // Se guarda y ejecuta el siguiente comando para
226226     crear las tablas iniciales del proyecto:
227227     
228228     python manage.py migrate
229229     
230230     // Se ejcuta el comando para crear el superusuario o
231231     usuario administrador del proyecto:
232232     
233233     python manage.py createsuperuser
234234     
235235     // Se introducen los datos que solicita
236236     // Se ejecuta el siguiente comando para activar el
237237     servidor de prueba de forma local
238238     
239239     python manage.py runserver
240240     \end{verbatim}
241241     \end{frame}
242242     
243243     \begin{frame}[fragile]
244244     \begin{verbatim}
245245     python manage.py runserver
246246     
247247     // Arroja el siguiente mensaje
248248     Performing system checks...
249249     
250250     System check identified no issues (0 silenced).
251251     
252252     July 26, 2017 - 15:32:30
253253     Django version 1.11.3,using settings 'curso.settings'
254254     Starting development server at http://127.0.0.1:8000/
255255     Quit the server with CONTROL-C.
256256     
257257     // Abrimos el navegador de preferencia y colocamos la
258258     siguiente dirección para acceder al sistema
259259     administrativo del proyecto:
260260     
261261     http://localhost:8000/admin
262262     \end{verbatim}
263263     \end{frame}
264264     
265265     \subsection{Crear aplicaciones}
266266     \begin{frame}[fragile]
267267     \begin{verbatim}
268268     
269269     http://localhost:8000/admin
270270     
271271     // En el debemos autenticarnos con el usuario y
272272     password del superusuario creado en los pasos
273273     anteriores
274274     
275275     // Allí podemos gestionar los usuarios del sistema
276276     así como los grupos que evenctualmente se utilizan
277277     para asignar permisos de acceso.
278278     
279279     // En el terminal presionar las teclas Ctrl + C para
280280     interrumpir la ejecución del servidor y así crear
281281     las aplicaciones del proyecto.
282282     
283283     python manage.py startapp encuesta
284284     
285285     \end{verbatim}
286286     \end{frame}
287287     
288288     \subsection{Modelos}
289289     \begin{frame}[fragile]
290290     \begin{verbatim}
291291     python manage.py startapp encuesta
292292     
293293     // Se edita el archivo encuesta/models.py
294294     
295295     from django.db import models
296296     
297297     class Question(models.Model):
298298         question_text = models.CharField(max_length=200)
299299         pub_date =models.DateTimeField('date published')
300300     
301301     class Choice(models.Model):
302302         question = models.ForeignKey(Question,
303303                    on_delete=models.CASCADE)
304304         choice_text = models.CharField(max_length=200)
305305         votes = models.IntegerField(default=0)
306306     
307307     \end{verbatim}
308308     \end{frame}
309309     
310310     \begin{frame}[fragile]
311311     \begin{verbatim}
312312     // Almacenamos y editamos el archivo
313313     curso/settings.py la constante:
314314     
315315     INSTALLED_APPS = [
316316         ...
317317         'django.contrib.staticfiles',
318318         'encuesta',
319319     ]
320320     
321321     // Para crear las tablas correspondiente de models.py
322322     se ejecuta el comando:
323323     
324324     python manage.py makemigrations encuesta
325325     
326326     python manage.py migrate encuesta
327327     
328328     \end{verbatim}
329329     \end{frame}
330330     
331331     \subsection{Relaciones}
332332     \begin{frame}[fragile]
333333     \begin{verbatim}
334334     // Para el manejo de las tablas por medio del
335335     framework se puede realizar desde el terminal
336336     con el comando:
337337     
338338     python manage.py shell
339339     
340340     
341341     \end{verbatim}
342342     \end{frame}
343343     
344344     \subsection{Django shell y Querysets}
345345     \begin{frame}[fragile]
346346     \begin{verbatim}
347347     
348348     // Allí podemos ejecutar las siguientes instrucciones
349349     
350350     from encuesta.models import Question, Choice
351351     from django.utils import timezone
352352     
353353     Question.objects.all()
354354     q = Question(question_text="Que hay de nuevo?",
355355                          pub_date=timezone.now())
356356     q.save()
357357     q.id
358358     q.question_text
359359     q.pub_date
360360     q.question_text = "Q ai d nuevo?"
361361     q.save()
362362     
363363     Ctril + D para salir
364364     \end{verbatim}
365365     \end{frame}
366366     
367367     \begin{frame}[fragile]
368368     \begin{verbatim}
369369     Editamos nuevamente el archivo encuesta/models.py
370370     para añadir el sigueinte metodo a la clase Question
371371     
372372     import datetime
373373     
374374     from django.db import models
375375     from django.utils import timezone
376376     
377377     class Question(models.Model):
378378         # ...
379379         def was_published_recently(self):
380380             return self.pub_date >= timezone.now() -
381381                           datetime.timedelta(days=1)
382382     
383383     Guardamos y volvemos a terminal:
384384     
385385     python manage.py shell
386386     
387387     \end{verbatim}
388388     \end{frame}
389389     
390390     \begin{frame}[fragile]
391391     \begin{verbatim}
392392     from polls.models import Question, Choice
393393     
394394     Question.objects.all()
395395     q = Question.objects.get(pk=1)
396396     q.was_published_recently()
397397     
398398     q = Question.objects.filter(id=1)
399399     
400400     q = Question.objects.filter(
401401               question_text__startswith='Q')
402402     
403403     from django.utils import timezone
404404     current_year = timezone.now().year
405405     Question.objects.get(pub_date__year=current_year)
406406     
407407     Question.objects.get(id=2) Error...
408408     \end{verbatim}
409409     \end{frame}
410410     
411411     \begin{frame}[fragile]
412412     \begin{verbatim}
413413     q = Question.objects.get(pk=1)
414414     q.choice_set.all()
415415     q.choice_set.create(choice_text='No mucho', votes=0)
416416     q.choice_set.create(choice_text='Muchas cosas'
417417                                                ,votes=0)
418418     c = q.choice_set.create(choice_text='De todo un poco'
419419                                                ,votes=0)
420420     
421421     c.question
422422     
423423     q.choice_set.all()
424424     q.choice_set.count()
425425     
426426     Crtl + D para salir
427427     
428428     \end{verbatim}
429429     \end{frame}
430430     
431431     \begin{frame}[fragile]
432432     \begin{verbatim}
433433     Incluir el modelo de la aplicación encuesta
434434     en el sistema admin:
435435     
436436     Editamos el archivo encuesta/admin.py
437437     from django.contrib import admin
438438     
439439     from .models import Question
440440     
441441     admin.site.register(Question)
442442     
443443     Guardamos y ejecutamos el servidor
444444     de prueba nuevamente:
445445     
446446     python manage.py runserver
447447     
448448     en el navegador http://localhost:8000/admin
449449     
450450     \end{verbatim}
451451     \end{frame}
452452     
453453     \subsection{Configurar URLs y primera views}
454454     \begin{frame}[fragile]
455455     \begin{verbatim}
456456     Crear la primera vista para acceso del proyecto
457457     Editamos el archivo encuesta/urls.py
458458     
459459     from django.conf.urls import url
460460     from . import views
461461     urlpatterns = [
462462         # ex: /encueta/
463463         url(r'^$', views.index, name='index'),
464464         # ex: /encuesta/5/
465465         url(r'^(?P<question_id>[0-9]+)/$',
466466         views.detail, name='detail'),
467467         # ex: /encuesta/5/results/
468468         url(r'^(?P<question_id>[0-9]+)/results/$',
469469         views.results, name='results'),
470470         # ex: /encuesta/5/vote/
471471         url(r'^(?P<question_id>[0-9]+)/vote/$',
472472          views.vote, name='vote'),
473473     ]
474474     \end{verbatim}
475475     \end{frame}
476476     
477477     \begin{frame}[fragile]
478478     \begin{verbatim}
479479     Editamos el archivo encuesta/views.py:
480480     
481481     from django.http import HttpResponse
482482     from .models import Question
483483     
484484     def index(request):
485485         question_list = Question.objects.order_by('-pub_date')[:5]
486486         output = ', '.join([q.question_text for q in question_list])
487487         return HttpResponse(output)
488488     
489489     def detail(request, question_id):
490490         return HttpResponse("Question No: %s." % question_id)
491491     
492492     def results(request, question_id):
493493         response = "Results of question %s."
494494         return HttpResponse(response % question_id)
495495     
496496     def vote(request, question_id):
497497         return HttpResponse("Voting on question %s." % question_id)
498498     \end{verbatim}
499499     \end{frame}
500500     
501501     \begin{frame}[fragile]
502502     \begin{verbatim}
503503     Guardamos y ejecutamos el servidor de prueba y
504504     probamos los enlaces desde el navegador:
505505     
506506     python manage.py runserver
507507     
508508     En el navegador probamos los siguientes enlaces:
509509     
510510     http://localhost:8000/encueta
511511     http://localhost:8000/encueta/1
512512     http://localhost:8000/encueta/1/result
513513     http://localhost:8000/encueta/1/vote
514514     
515515     \end{verbatim}
516516     \end{frame}
517517     
518518     \subsection{Sistema de plantillas}
519519     
520520     \begin{frame}[fragile]
521521     \begin{verbatim}
522522     Uso del plantillas:
523523     
524524     Creamos la siguiente estructura
525525     
526526     cd encuesta
527527     mkdir templates
528528     mkdir templates/encuesta
529529     
530530     y editamos el archivo index.html allí
531531     
532532     gedit encuesta/templates/encuesta/index.html
533533     
534534     \end{verbatim}
535535     \end{frame}
536536     
537537     \begin{frame}[fragile]
538538     \begin{verbatim}
539539     {% if question_list %}
540540         <ul>
541541         {% for question in question_list %}
542542             <li>
543543              <a href="/encuesta/{{ question.id }}/">
544544               {{
545545                 question.question_text
546546               }}
547547              </a>
548548             </li>
549549         {% endfor %}
550550         </ul>
551551     {% else %}
552552         <p>No hay encuestas.</p>
553553     {% endif %}
554554     \end{verbatim}
555555     \end{frame}
556556     
557557     \begin{frame}[fragile]
558558     \begin{verbatim}
559559     Guardamos y modificamos el archivo encuesta views.py
560560     para que utilice la plantilla
561561     
562562     from django.http import HttpResponse
563563     from django.template import loader
564564     
565565     from .models import Question
566566     
567567     
568568     def index(request):
569569         question_list = Question.objects.order_by('-pub_date')[:5]
570570         template = loader.get_template('polls/index.html')
571571         context = {
572572             'question_list': question_list,
573573         }
574574         return HttpResponse(template.render(context, request))
575575     
576576     \end{verbatim}
577577     \end{frame}
578578     
579579     \begin{frame}[fragile]
580580     \begin{verbatim}
581581     o utilizando la shortcuts render
582582     
583583     from django.shortcuts import render
584584     
585585     from .models import Question
586586     
587587     
588588     def index(request):
589589         question_list = Question.objects.order_by('-pub_date')[:5]
590590         context = {'question_list': question_list}
591591         return render(request, 'polls/index.html', context)
592592     
593593     
594594     \end{verbatim}
595595     \end{frame}
596596     
597597     \subsection{Configurar estáticos}
598598     \begin{frame}[fragile]
599599     \begin{verbatim}
600600     Descargar plantillas prediseñadas, por ejemplo:
601601     
602602     https://adminlte.io/
603603     
604604     Copiar los directorios ccs y js en los en la carpeta static
605605     
606606     Copiar los archivo *.html en la carpeta templates
607607     
608608     Editar index.html y cambiar los enlaces a cada archivo en:
609609     
610610     <link rel="stylesheet"
611611     href="{% static 'css/DataTables/jquery.dataTables.min.css' %}">
612612     
613613     \end{verbatim}
614614     \end{frame}
615615     
616616     \subsection{Listar Registros}
617617     \begin{frame}[fragile]
618618     \begin{verbatim}
619619     Creamos el archivo ajax.py
620620     
621621     # -*- encoding: utf-8 -*-
622622     from django.conf import settings
623623     from django_datatables_view.base_datatable_view import (
624624        BaseDatatableView)
625625       
626626     from django.contrib.auth.models import (
627627         User)
628628     
629629     class ListUsersAjaxView(BaseDatatableView):
630630         model = User
631631         columns = ['pk','first_name','last_name','username','email',
632632                    'date_joined', 'last_joined' ]
633633         order_columns = ['pk', 'username']
634634         max_display_length = 500
635635       
636636         def __init__(self):
637637             super(ListUsersAjaxView, self).__init__()
638638     
639639         def get_initial_queryset(self):
640640             return self.model.objects.all()
641641     \end{verbatim}
642642     \end{frame}
643643     
644644     \begin{frame}[fragile]
645645     \begin{verbatim}
646646     def prepare_results(self, qs):
647647       json_data = []
648648       for item in qs:
649649         json_data.append([
650650           username,
651651          "{0} {1}".format(str(item.first_name),str(item.last_name)),
652652           item.email,
653653           item.date_joined.strftime("%Y-%m-%d %H:%M:%S"),
654654           last_login               
655655         ])
656656               
657657       return json_data
658658     # Fin del archivo ajax.py
659659     
660660     #En el archivo urls.py anexar las siguientes lineas
661661     from .ajax import *
662662     
663663     urlpatterns = [
664664         ....
665665     url(r'^listar-users/$', ListUsersAjaxView.as_view(),
666666             name="listar_users"),
667667     \end{verbatim}
668668     \end{frame}
669669     
670670     \begin{frame}[fragile]
671671     \begin{verbatim}
672672     Se anexa el siguiente código el archivo index.html
673673     En la parte visual:
674674     
675675     <div id="datatable"></div>
676676     
677677     Y en la parte de código javascript
678678     
679679     <script type="text/javascript">
680680     $(document).ready(function() {
681681        $('#datatable').dataTable({
682682             "processing": true,
683683             "serverSide": true,
684684             "ajax": {% url 'listar_user'%},
685685             language: {url: JSON_DATA}
686686             });
687687         $('#datatable')
688688             .removeClass('display')
689689             .addClass('table table-striped table-bordered');
690690     });
691691     </script>
692692     \end{verbatim}
693693     \end{frame}
694694     
695695     \subsection{Anexar registros}
696696     \begin{frame}[fragile]
697697     \begin{verbatim}
698698     Creamos el método en el archivo views.py
699699     
700700     def AnexarRegistro(request):
701701         if request.method == 'POST':
702702           
703703             vusername = request.POST['username']
704704             u = User(username = vusername)
705705             u.save()
706706             message = _("El usuario fue creado")
707707             template = loader.get_template('personal/profile.html')
708708         context = {'message':message}
709709         return HttpResponse(template.render(context, request))
710710           
711711     \end{verbatim}
712712     \end{frame}
713713     
714714     \subsection{Modificar y eliminar registros}
715715     \begin{frame}[fragile]
716716     \begin{verbatim}
717717     @login_required
718718     def change_profile(request):
719719         """ Cambiar perfil de usuario
720720         """
721721         if request.method == 'POST':
722722             user_id = request.POST['user_id']
723723             personal = User.objects.get(user_id=request.user.id)               
724724             personal.first_name = request.POST['fname']
725725             personal.last_name = request.POST['lname']
726726             personal.email = request.POST['email']
727727             personal.is_active = request.POST.get('is_active')
728728             personal.user.save()
729729           
730730             message = _("The profile change was made")
731731             context = {'personal':personal,'message':message,}
732732         template = loader.get_template('personal/profile.html')
733733         return HttpResponse(template.render(context, request))
734734     
735735     \end{verbatim}
736736     \end{frame}
737737     
738738     \begin{frame}[fragile]
739739     \begin{verbatim}
740740     @login_required
741741     def delete_personal(request):
742742         """ Delete users
743743         """
744744         id = json.loads(request.POST['seleccionados'])
745745         print id
746746     
747747         for id_values in id:
748748             if id_values["id"] != "0":
749749                       
750750                 u = User.objects.get(pk=int(id_values["id"]))
751751                 u.delete()   
752752               
753753         return redirect('personal')
754754     \end{verbatim}
755755     \end{frame}
756756     
757757     \subsection{View's}
758758     \begin{frame}[fragile]
759759     \begin{verbatim}
760760     ####  ListView
761761     
762762     # En el archivo views.py
763763     
764764     from django.views.generic.list import ListView
765765     from django.utils import timezone
766766     
767767     from articles.models import Article
768768     
769769     class ArticleListView(ListView):
770770     
771771         model = Article
772772     
773773         def get_context_data(self, **kwargs):
774774             context = super(ArticleListView,
775775                             self).get_context_data(**kwargs)
776776             context['now'] = timezone.now()
777777             return context
778778     
779779     \end{verbatim}
780780     \end{frame}
781781     
782782     \begin{frame}[fragile]
783783     \begin{verbatim}
784784     
785785     # En el archivo urls.py
786786     from django.conf.urls import url
787787     
788788     from article.views import ArticleListView
789789     
790790     urlpatterns = [
791791      url(r'^$',ArticleListView.as_view(),name='article-list'),
792792     ]
793793     
794794     # El template
795795     <h1>Articles</h1>
796796     <ul>
797797     {% for article in object_list %}
798798         <li>
799799         {{ article.pub_date|date }} - {{ article.headline }}
800800         </li>
801801     {% empty %}
802802         <li>No articles yet.</li>
803803     {% endfor %}
804804     </ul>
805805     \end{verbatim}
806806     \end{frame}
807807     
808808     \begin{frame}[fragile]
809809     \begin{verbatim}
810810     #### DetailView
811811     
812812     # En el archivo views.py
813813     
814814     from django.views.generic.detail import DetailView
815815     from django.utils import timezone
816816     
817817     from articles.models import Article
818818     
819819     class ArticleDetailView(DetailView):
820820     
821821         model = Article
822822     
823823         def get_context_data(self, **kwargs):
824824             context = super(ArticleDetailView, self).
825825                       get_context_data(**kwargs)
826826             context['now'] = timezone.now()
827827             return context
828828           
829829     \end{verbatim}
830830     \end{frame}
831831     
832832     \begin{frame}[fragile]
833833     \begin{verbatim}
834834     
835835     # En el archivo urls.py
836836     
837837     from django.conf.urls import url
838838     
839839     from article.views import ArticleDetailView
840840     
841841     urlpatterns = [
842842      url(r'^(?P<slug>[-\w]+)/$',ArticleDetailView.as_view(),
843843                                 name='article-detail'),
844844     ]
845845     
846846     # El template
847847     
848848     <h1>{{ object.headline }}</h1>
849849     <p>{{ object.content }}</p>
850850     <p>Reporter: {{ object.reporter }}</p>
851851     <p>Published: {{ object.pub_date|date }}</p>
852852     <p>Date: {{ now|date }}</p>
853853     \end{verbatim}
854854     \end{frame}
855855     
856856     \begin{frame}[fragile]
857857     \begin{verbatim}
858858     #### CreateView
859859     
860860     from django.views.generic.edit import CreateView
861861     from myapp.models import Author
862862     
863863     class AuthorCreate(CreateView):
864864         model = Author
865865         fields = ['name']
866866     
867867     # En el template
868868     
869869     <form action="" method="post">{% csrf_token %}
870870         {{ form.as_p }}
871871         <input type="submit" value="Save" />
872872     </form>
873873     
874874     \end{verbatim}
875875     \end{frame}
876876     
877877     \begin{frame}[fragile]
878878     \begin{verbatim}
879879     #### UpdateView
880880     
881881     from django.views.generic.edit import UpdateView
882882     from myapp.models import Author
883883     
884884     class AuthorUpdate(UpdateView):
885885         model = Author
886886         fields = ['name']
887887         template_name_suffix = '_update_form'
888888       
889889     # En el template
890890     
891891     <form action="" method="post">{% csrf_token %}
892892         {{ form.as_p }}
893893         <input type="submit" value="Update" />
894894     </form>
895895     
896896     \end{verbatim}
897897     \end{frame}
898898     
899899     \begin{frame}[fragile]
900900     \begin{verbatim}
901901     #### DeleteView
902902     
903903     from django.views.generic.edit import DeleteView
904904     from django.urls import reverse_lazy
905905     from myapp.models import Author
906906     
907907     class AuthorDelete(DeleteView):
908908         model = Author
909909         success_url = reverse_lazy('author-list')
910910       
911911     # En el template
912912     
913913     <form action="" method="post">{% csrf_token %}
914914         <p>Are you sure you want to delete "{{ object }}"?</p>
915915         <input type="submit" value="Confirm" />
916916     </form>
917917     
918918     \end{verbatim}
919919     \end{frame}
920920     
921921     \subsection{Crear Login}
922922     \begin{frame}[fragile]
923923     \begin{verbatim}
924924     Creamos la aplicacion user desde la consola:
925925     
926926     python manage.py startapp user
927927     
928928     Editamos el archivo user/views.py:
929929     
930930     # -*- coding: utf-8 -*-
931931     
932932     from django.shortcuts import render
933933     from django.contrib import messages
934934     from django.contrib.auth import (
935935         authenticate, logout, login
936936     )
937937     from django.contrib.auth.models import (
938938         Group, Permission, User
939939     )
940940     
941941     class LoginView(FormView):
942942         form_class = FormularioLogin
943943         template_name = 'users.login.html'
944944         success_url = '/inicio/'
945945     \end{verbatim}
946946     \end{frame}
947947     
948948     \begin{frame}[fragile]
949949     \begin{verbatim}
950950     def form_valid(self, form):
951951           
952952         usuario = form.cleaned_data['usuario']
953953         contrasena = form.cleaned_data['contrasena']
954954         usuario = authenticate(username=usuario,password=contrasena)
955955           
956956         if usuario is not None:
957957             login(self.request, usuario)
958958             messages.info(self.request,'Bienvenido %s has ingresado\
959959                                         Sistema con el usuario %s \
960960                                         ' % (usuario.first_name,
961961                                              usuario.username))
962962         else:
963963             self.success_url = reverse_lazy('users:login')
964964             messages.warning(self.request,'Verifique su nombre y \
965965                                            contraseña\
966966                                           y vuelve a intertar')
967967     
968968         return super(LoginView, self).form_valid(form)
969969     
970970     \end{verbatim}
971971     \end{frame}
972972     
973973     \subsection{Registro de Usuarios}
974974     \begin{frame}[fragile]
975975     \begin{verbatim}
976976     #### Crear Permisos desde el shell ejecutar
977977     
978978     from myapp.models import BlogPost
979979     from django.contrib.auth.models import Permission
980980     from django.contrib.contenttypes.models import ContentType
981981     
982982     content_type = ContentType.objects.get_for_model(BlogPost)
983983     permission = Permission.objects.create(
984984         codename='can_publish',
985985         name='Can Publish Posts',
986986         content_type=content_type,
987987     )
988988     
989989     \end{verbatim}
990990     \end{frame}
991991     
992992     \begin{frame}[fragile]
993993     \begin{verbatim}
994994     
995995     from django.contrib.auth.models import Permission, User
996996     from django.contrib.contenttypes.models import ContentType
997997     from django.shortcuts import get_object_or_404
998998     
999999     from myapp.models import BlogPost
10001000   
10011001    def user_gains_perms(request, user_id):
10021002        user = get_object_or_404(User, pk=user_id)
10031003        # any permission check will
10041004        #cache the current set of permissions
10051005        user.has_perm('myapp.change_blogpost')
10061006   
10071007        content_type=ContentType.objects.get_for_model(BlogPost)
10081008        permission = Permission.objects.get(
10091009            codename='change_blogpost',
10101010            content_type=content_type,
10111011        )
10121012        user.user_permissions.add(permission)
10131013   
10141014    \end{verbatim}
10151015    \end{frame}
10161016   
10171017    \subsection{Login required}
10181018    \begin{frame}[fragile]
10191019    \begin{verbatim}
10201020   
10211021    from django.contrib.auth.decorators import
10221022      login_required, permission_required
10231023    from django.views.generic import TemplateView
10241024   
10251025    from .views import VoteView
10261026   
10271027    urlpatterns = [
10281028        url(r'^about/$', login_required(
10291029               TemplateView.as_view(template_name="secret.html"))),
10301030        url(r'^vote/$', permission_required(
10311031               'polls.can_vote')(VoteView.as_view())),
10321032    ]
10331033   
10341034    \end{verbatim}
10351035    \end{frame}
10361036   
10371037    \subsection{Recuperar contraseña por correo}
10381038    \begin{frame}[fragile]
10391039    \begin{verbatim}
10401040    def newpassword(request):
10411041        puser = request.POST['puser']
10421042        try:
10431043            user = User.objects.get(username=puser)
10441044            randompass = ''.join([choice(
10451045            '1234567890qwertyuiopasdfghjklzxcvbnm')
10461046            for i in range(10)])
10471047            print randompass
10481048            subject = _('System: New Password')
10491049            message = _('Your password is reset, new password: ')
10501050                        + randompass
10511051            user.email_user("subject","message")
10521052            user.set_password(randompass)
10531053            user.save()
10541054        except:
10551055            print "error send mail"
10561056            mensaje = _("User not found")
10571057        return redirect('/authenticate/signin')
10581058     
10591059    \end{verbatim}
10601060    \end{frame}
10611061   
10621062    \subsection{Conceptos avanzados}
10631063    \begin{frame}[fragile]
10641064    \begin{verbatim}
10651065    Otros conceptos
10661066   
10671067    * Internacionalización
10681068    * Zonas Horarias
10691069    * Servidor Web
10701070    * Geodjango
10711071    * Django Rest
10721072   
10731073     Entre otros...
10741074   
10751075    \end{verbatim}
10761076    \end{frame}
10771077   
10781078    \begin{frame}[plain]
10791079   
10801080     
10811081          \begin{center}
10821082   
10831083            \font\endfont = cmss10 at 15.40mm
10841084            \color{Brown}
10851085            \endfont 
10861086            \baselineskip 20.0mm
10871087   
10881088            CENDITEL
10891089   
10901090          \end{center}   
10911091   
10921092       
10931093    \end{frame}
10941094   
10951095   
10961096    \end{document}
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.