Professional Documents
Culture Documents
Un sitio pblico que permite a la gente ver las encuestas y votar en ellas.
Un sitio de administracin que le permite agregar, modificar y eliminar las encuestas.
Bueno empezaremos por la instalacin en mi caso instalaremos Django en Mac:
Python ya viene instalado en mac al igual que en Linux, en Windows si les toca instalar Python.
Comandos en consola
$python
Exit
$sudo easy_install pip
$sudo pip install virtual env
$ls
$pwd
$cd carpeta/
$cd ../
$virtualenv entorno
$source bin/activate
(entorno)$pip freeze
(entorno)$pip install django==1.45
(entorno)$pip install django upgrade
Realiza
Muestra la versin de python, y entra al Shell
Sale del Shell de python
Instala pip
Instala virtualenv
Para ver los archivos contenidos
Ve la direccin en donde te encuentras
Accede a carpeta
Sale de carpeta
Crea un entorno virtual
Entras a la carpeta y activas el entorno virtual
Ves lo que tienes instalado
Instalas django 1.45
Actualizas django a la versin mas reciente
Creacin de un proyecto
Creamos el proyecto con la linea
miproyecto/settings.py. bueno para comenzar solo comenzaremos la ubicacin de nuestra regin y si deseamos la
LANGUAGE_CODE = es-pe
Posterioemente y obedeciendo a django 1.7 tenemos que migrar la bd.
La creacin de modelos
Ahora que su entorno - un "proyecto" - est configurado, ya est listo para empezar a hacer el trabajo.
Cada aplicacin se escribe en Django consiste en un paquete de Python que sigue a una cierta convencin. Django viene con una
utilidad que genera automticamente la estructura de directorios bsica de una aplicacin, para que pueda centrarse en la escritura de
cdigo en lugar de crear directorios.
Creamos nuestra primera aplicacin, por lo pronto junto a manage.py
pregunta.
Estos conceptos estn representados por las clases de Python simples. Editar el archivo de
que se ve as:
encuestas/models.py
encuestas/models.py por lo
votos = models.IntegerField(default=0)
nos falta decirle a Django que tenemos una aplicacin nueva, esto lo hacemos con:
miproyecto / settings.py
INSTALLED_APPS = (
'Django.contrib.admin',
'Django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'encuestas',
)
Le decimos a django que hicimos modificaciones en el modelo con:
# consultar preguntas.
>>> Pregunta.objects.all()
[]
# Crear una pregunta.
# para la fecha necesitaremos importar timezone
>>> from django.utils import timezone
>>> q = Pregunta(pregunta_texto="estoy haciendo bien", publi_fech=timezone.now())
# guardamos los valores en q y luego lo guardamos.
>>> q.save()
# preguntamos el id, deveria de ser 1
>>> q.id
1
<Pregunta: objeto Question>. Es, absolutamente, una representacin poco til de este
de preguntas (en el archivo de encuestas / models.py) y la
adicin de un __str__()mtodo para la Pregunta y Eleccin:
Espera un minuto
encuestas/models.py
from django.db import models
class Pregunta(models.Model):
# ...
def __str__(self):
return self.pregunta_texto
class Opcion(models.Model):
# ...
def __str__(self):
return self.opcion_texto
# __unicode__ on Python 2
# __unicode__ on Python 2
Username: root
Onemos una direccin de correo
Ahora, abra un navegador Web y vaya a "/ admin /" en su dominio local - por
ejemplo, http://127.0.0.1:8000/admin/ . Usted debe ver la pantalla de inicio de sesin del
administrador:
Esto no es impresionante, con slo dos campos, pero para las formas de administracin con
docenas de campos, la eleccin de un orden intuitivo es un detalle importante usabilidad.
Y hablando de formularios con docenas de campos, es posible que desee dividir el formulario de
arriba en fieldsets:
encuestas/admin.py
{'fields':
admin.site.register(Pregunta, PreguntaAdmin)
El primer elemento de cada tupla en fieldsets es el ttulo del grupo de campos. Esto es lo que
nuestra forma parece ahora:
Puede asignar clases HTML arbitrarios a cada conjunto de campos. Django proporciona una
clase "colapso" que muestra un conjunto de campos en particular colapsado inicialmente. Esto
es til cuando se tiene una forma larga que contiene una serie de campos que no son de uso
general:
polls/admin.py
Como vemos cada Opcion esta relaciona con una pregunta esto es porque esta
relacionado con foreignKey
encuestas/admin.py
class OpcionInline(admin.TabularInline):
#...
Tambien podemos incluir lo que pusimos en el mtodo de los artculos recientes
encuestas/admin.py
class PreguntaAdmin(admin.ModelAdmin):
# ...
list_display = ('pregunta_texto', 'publi_fech',
'was_published_recently')
ahora podemos observar nuestra pagina de administracin de la siguiente manera:
class Pregunta(models.Model):
# ...
def was_published_recently(self):
return self.publi_fech >= timezone.now() - datetime.timedelta(days=1)
was_published_recently.admin_order_field = 'publi_fech'
was_published_recently.boolean = True
was_published_recently.short_description = 'Publcado reciente?'
Edite el archivo de encuestas/admin.py y aadir una mejora a la pgina de lista de
cambios Pregunta: filtros utilizando el list_filter . Agregue la siguiente lnea
a PreguntaAdmin:
list_filter = ['publi_fech']
Eso aade una barra lateral "filtro" que permite a los usuarios filtrar la lista de cambios por el
campo publi_fech:
El tipo de filtro que se muestra depende del tipo de campo que est filtrando
en. Debido publi_fech es un DateTimeField , Django sabe dar opciones de filtro apropiadas:
"Cualquier fecha", "Hoy", "Los ltimos 7 das", "Este mes", "este ao."
Este se perfila bien. Vamos a aadir un poco de capacidad de bsqueda con solo aumentar la
siguiente linea:
search_fields = ['pregunta_texto']
Eso agrega un cuadro de bsqueda en la parte superior de la lista de cambios. Cuando alguien
entra en los trminos de bsqueda, Django buscar el campo pregunta_texto. Puede utilizar
tantos campos como desee - aunque, ya que utiliza una consulta como detrs de las escenas,
lo que limita el nmero de campos de bsqueda a un nmero razonable, ser ms fcil para su
base de datos para hacer la bsqueda.
Ahora tambin es un buen momento para sealar que las listas de cambios le dan paginacin
libre. El valor predeterminado es mostrar 100 elementos por pgina. Cambiar lista de
paginacin , cuadros de bsqueda , filtros , fecha-las jerarquas, y la columnaheader-ordenar todos trabajamos juntos como usted piensa que debera hacerlo.
Este archivo de plantilla contiene una gran cantidad de texto como {% branding
bloque%} y {{title}}. La {{{% y etiquetas son parte del lenguaje de plantillas de
Django. Cuando Django hace admin / base_site.html, este lenguaje de la plantilla ser
evaluada para producir la pgina HTML final. No se preocupe si usted no puede hacer cualquier
sentido de la plantilla en este momento - vamos a profundizar en lenguaje de plantillas de Django
en el Tutorial 3.
Tenga en cuenta que ninguna de las plantillas de administracin por defecto de Django se puede
anular. Para anular una plantilla, hacer lo mismo que hizo con base_site.html - copiarlo desde
el directorio por defecto en su directorio personalizado, y realizar cambios.
Una vista es un "tipo" de la pgina Web en la aplicacin Django que por lo general cumple una
funcin especfica y tiene una plantilla especfica. Por ejemplo, en una aplicacin de blog, es
posible que tenga los siguientes puntos de vista:
Pgina de archivo de base Ao - muestra todos los meses con entradas en el ao dado.
Pgina de archivo basado en Mes - muestra todos los das con las entradas en el mes dado.
Pregunta pgina "detalle" - muestra un texto de la pregunta, sin resultados, pero con una forma
de votar.
Accin Vote - se encarga de la votacin para una eleccin en particular en una pregunta en
particular.
En Django, pginas web y otros contenidos son entregados por las vistas. Cada vista est
representada por una funcin de Python sencilla (o mtodo, en el caso de puntos de vista
basados en la clase). Django elegir una vista mediante el examen de la URL que se solicita (para
ser ms precisos, la parte de la URL despus del nombre de dominio).
En su tiempo en la web que usted puede haber llegado a travs de este tipo de bellezas como
"ME2 / Sitios / dirmod.asp? Sid = & type = gen y mod = Core + Pages y gid =
A6CD4967199A42D9B65B1B". Usted estar encantado de saber que Django nos
permite patrones de URL mucho ms elegante que eso.
Un patrn de URL es simplemente la forma general de una URL - por ejemplo: / Archivo de
encuestas / views.py
Esta es la vista ms simple posible en Django. Para llamar a la vista, tenemos que asignar a una
URL - y para esto necesitamos un URLconf.
Para crear una URLconf en el directorio de encuestas, cree un archivo llamado urls.py. Su
directorio de aplicacin debe ser similar a:
encuestas / urls.py
url(r'^$', views.index,
miproyecto / urls.py
ndice.
La url () la funcin se pasa cuatro argumentos, se requieren dos: regex y vista, y dos
opcionales: kwargs ynombre. En este punto, vale la pena revisar lo que estos argumentos son para.
url () argumento: regex
El trmino "regex" es una forma corta de uso comn que significa "expresin regular", que es una sintaxis para
hacer coincidir patrones en cadenas, o en este caso, patrones de URL. Django comienza en la primera
expresin regular y hace su camino hacia abajo la lista, comparando la URL solicitada con cada expresin
regular hasta que encuentra uno que coincida.
Tenga en cuenta que estas expresiones regulares no buscan parmetros GET y POST, o el nombre de
dominio. Por ejemplo, en una solicitud de http://www.example.com/myapp/, la URLconf
buscar miaplicacion /. En una peticin a http://www.example.com/myapp/?page=3, la
URLconf tambin buscar miaplicacion /.
Si usted necesita ayuda con las expresiones regulares, consulte la entrada de Wikipedia y la documentacin de
la remdulo. Adems, el libro de O'Reilly "Mastering Regular Expressions" de Jeffrey Friedl es fantstico. En
la prctica, sin embargo, no es necesario ser un experto en expresiones regulares, ya que slo se necesita saber
cmo capturar patrones simples. De hecho, expresiones regulares complejas pueden tener malos resultados de
bsqueda, por lo que probablemente no deben confiar en el poder de las expresiones regulares.
Por ltimo, una nota de rendimiento: estas expresiones regulares son compilados la primera vez que se carga el
mdulo URLconf. Son sper rpido (siempre que las bsquedas no son demasiado complejos como se seal
anteriormente).
url () argumento: Vista
Cuando Django encuentra una coincidencia de expresiones regulares, Django llama a la funcin vista
especificada, con una HttpRequest objeto como primer argumento y los valores "capturados" de la
expresin regular como otros argumentos. Si la expresin regular utiliza capturas simples, los valores se pasan
como argumentos posicionales; si utiliza capturas con nombre, los valores se pasan como argumentos de
palabra clave. Vamos a dar un ejemplo de esto en un momento.
url () argumento: kwargs
Argumentos clave arbitrarias se pueden pasar en un diccionario a la vista de destino. No vamos a utilizar esta
caracterstica de Django en el tutorial.
url () argumento: nombre
El nombramiento de su URL permite referirse a ella de forma inequvoca de otras partes de Django
especialmente plantillas. Esta potente funcin le permite realizar cambios globales en los patrones de URL de
su proyecto, mientras que slo tocar un solo archivo.
Escribir ms vistas
Ahora vamos a aadir un poco ms de visitas a las encuestas / views.py. Estos puntos de
vista son un poco diferentes, porque toman un argumento:
Encuestas/views.py
Entonces, Django quitarse el texto correspondiente ("encuestas/") y enviar el resto del texto
- "34/" - a URLconf los 'polls.urls' para su posterior procesamiento que coincide con r '^
(P<pregunta_id>\d+)/$ 'que resulta en una llamada al detalle() ver de este modo:
detail(request=<HttpRequest object>,
pregunta_id='34')
para que coincida con una secuencia de dgitos (es decir, un nmero).
Debido a que los patrones de URL son expresiones regulares, realmente no hay lmite a lo
que puedes hacer con ellos. Y no hay necesidad de aadir URL, hay cosas tales
como Html - a menos que usted desea, en cuyo caso se puede hacer algo como esto:
(r'^encuestas/latest\.html$',
'encuestas.views.index'),
#
from polls.models import Question
def index(request):
latest_pregunta_list =
Pregunta.objects.order_by('-publi_fech')[:5]
output = ', '.join([p.pregunta_texto for p in
latest_pregunta_list])
return HttpResponse(output)
Hay un problema aqu, sin embargo: el diseo de la pgina est codificado en la vista. Si
desea cambiar la apariencia de la pgina, tendrs que editar el cdigo Python. As que vamos
a usar el sistema de plantillas de Django para separar el diseo de Python mediante la
creacin de una plantilla que la visin puede utilizar.
En primer lugar, cree un directorio llamado templates en la carpeta de encuestas Django
buscar plantillas ah.
De Django TEMPLATE_LOADERS configuracin contiene una lista de callables que saben cmo
importar plantillas de diversas fuentes. Uno de los valores por defecto
es django.template.loaders.app_directories.Loader que busca una "plantillas"
subdirectorio en cada uno de los INSTALLED_APPS - as es como Django sabe encontrar las
plantillas de encuestas a pesar de que no modific TEMPLATE_DIRS , como lo hicimos
en Tutorial 2 .
Dentro del directorio de plantillas que acaba de crear, cree otro directorio llamado encuestas, y
dentro de esa crear un archivo llamado index.html. En otras palabras, la plantilla debe estar
enlas encuestas / templates / encuestas / index.html. Debido a la forma en el
cargador de plantillas app_directoriesfunciona como se describe ms arriba, puede hacer
referencia a esta plantilla dentro de Django simplemente como encuestas / index.html.
Coloque el siguiente cdigo en la plantilla:
encuestas/templates/encuestas/index.html
{% if latest_pregunta_list %}
<ul>
{% for pregunta in latest_pregunta_list %}
<li><a href="/encuestas/{{ pregunta.id }}/">{{
pregunta.pregunta_texto }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>no hay encuestas disponibles.</p>
{% endif %}
Ahora vamos a actualizar nuestra vista del ndice en las encuestas/ views.py utilizar la
plantilla:
encuestas/views.py
def index(request):
latest_pregunta_list = Pregunta.objects.order_by('publi_fech')[:5]
template =
loader.get_template('encuestas/index.html')
context = RequestContext(request, {
'latest_pregunta_list': latest_pregunta_list,
})
return HttpResponse(template.render(context))
Ese cdigo carga las plantillas llamado encuestas/index.html y la pasa de un contexto. El
contexto es un mapeo plantilla diccionario nombres de variables a objetos Python.
Cargue la pgina apuntando desde su navegador en "/ encuestas /", y usted debera ver una lista
con vietas que contiene el "Qu pasa" pregunta del Tutorial 1. el enlace apunta a la pgina de
detalles de la cuestin.
Un atajo: render()
Es un lenguaje muy comn para cargar una plantilla, llenar un contexto y devolver
un HttpResponse objeto con el resultado de la plantilla mostrada. Django proporciona un
atajo. Aqu est la vista del ndice completo (), reescrito:
encuestas/views.py
def index(request):
latest_pregunta_list =
Pregunta.objects.all().order_by('-publi_fech')[:5]
context = {'latest_pregunta_list':
latest_pregunta_list}
return render(request,'encuestas/index.html',
context)
Tenga en cuenta que una vez que hemos hecho esto en todos estos puntos de vista, ya no
necesitamos importarloader , RequestContext y HttpResponse (usted querr
mantener HttpResponse si an tiene los mtodos de cdigo auxiliar para los detalles,
resultados y voto).
El render() funcin toma el objeto de solicitud como primer argumento, un nombre de plantilla
como su segundo argumento y un diccionario como opcional tercer argumento. Devuelve
un HttpResponse objeto de la plantilla dada prestados con el contexto dado.
sobre la pregunta objeto. De no ser as, se trata de una bsqueda de atributos - que trabaja, en este caso. Si
lookup atributo haba fallado, hubiera intentado un ndice de lista.
Mtodo insultos sucede en el {% for %} de bucle: pregunta.opcion_set.all se interpreta como la
pregunta.opcion_set.all cdigo Python(), que devuelve un iterable de objetos opcion y es
adecuado para su uso en la etiqueta {% for %}.
...
# the 'name' value as called by the {% url %} template
tag
url(r'^(?P<pregunta_id>\d+)/$', views.detail,
name='detail'),
...
Si desea cambiar la direccin URL de la vista encuestas detalle a otra cosa, tal vez a algo as como
encuestas / detalles / 12 / en lugar de hacerlo en la plantilla (o plantillas) que iba a cambiar
en las encuestas/urls.py:
...
# cambiamor la URL de acceso
url(r'^specifics/(?P<question_id>\d+)/$', views.detail,
name='detail'),
...
Namespacing nombres de URL
El proyecto tutorial tiene una sola aplicacin, las encuestas. En proyectos reales de Django,
puede haber cinco, diez, veinte o ms aplicaciones. Cmo Django diferenciar los nombres de
URL entre ellos? Por ejemplo, la aplicacin de encuestas tiene una vista de detalle, y
tambin podra hacerlo una aplicacin en el mismo proyecto que es para un blog. Cmo hacer
para que Django sabe que la vista de aplicaciones para crear una url cuando se utiliza el {%
url%} etiqueta de plantilla?
La respuesta es agregar espacios de nombres a tu URLconf raz. En el archivo de proyecto /
urls.py, seguir adelante y cambiar para incluir los espacios de nombre:
miproyecto/urls.py
urlpatterns = patterns('',
url(r'^encuestas/', include('encuestas.urls',
namespace="polls")),
url(r'^admin/', include(admin.site.urls)),
)
Ahora cambia su urls/ templates index.html desde:
encuestas/templates/encuestas/index.html
encuestas/templates/encuestas/detail.html
selected_choice.save()
# Always return an
HttpResponseRedirect after successfully dealing
# with POST data. This prevents data from being posted
twice if a
# user hits the Back button.
return HttpResponseRedirect(reverse('polls:results',
args=(p.id,)))
Este cdigo incluye un par de cosas que no hemos cubierto todava en este tutorial:
request.POST es un objeto similar a un diccionario que le permite acceder a los datos presentados por el
nombre de la clave. En este caso, request.POST ["opcion"] devuelve el identificador de la opcin
seleccionada, como una cadena. request.POST valores son siempre cadenas.
Tenga en cuenta que Django tambin ofrece request.GET para acceder a datos GET de la misma manera pero estamos usando explcitamente request.POST en nuestro cdigo, para garantizar que los datos slo se
altera a travs de una llamada POST.
este ejemplo. Esta funcin ayuda a evitar tener que codificar una URL en la funcin de vista. Se
da el nombre de la vista que queremos pasar el control de y la parte variable del patrn de URL
que apunta a esa vista. En este caso, el uso de la URLconf hemos creado en el Tutorial 3,
este reverse() llamada devolver una cadena como
'/polls/3/results/'
... Donde el 3 es el valor de p.id. Esta URL redirigida entonces llame a la
vista 'resultados' para mostrar la pgina final.
Como se mencion en el Tutorial 3, es una peticin HttpRequest objeto. Para ms
informacin sobre HttpRequestobjetos, consulte la solicitud y la documentacin respuesta .
Despus alguien vota en una pregunta, la opinin de voto() redirige a la pgina de resultados
para la pregunta. Vamos a escribir ese punto de vista:
encuestas/views.py
Esto es casi exactamente el mismo que la vista de detalle () desde Tutorial 3 . La nica
diferencia es el nombre de la plantilla. Vamos a arreglar esta redundancia despus.
Ahora, crear una plantilla de encuestas/results.html:
encuestas/templates/polls/results.html
Ahora, vaya a / encuestas / 1 / en el navegador y voto en la pregunta. Usted debe ver una pgina de
resultados que se actualiza cada vez que vote. Si usted enva el formulario sin haber elegido una opcin,
debera ver el mensaje de error.