Está en la página 1de 12

ESCCRIBIENDO MI PRIMERA APP EN DJANGO

1. Instalar PyCharm
2. Crear nuevo Proyecto
3. Instalar Django
pip install Django
4. Verificar la version istalada
Python -m django --version
5. Crear el Proyecto
django-admin startproject mysite
6. Ejecutar el servidor
Se ingresa al direcorio del proyecto con
cd mysite
python manage.py runserver
validamos que el servidor se este ejecutando dando clic en la dirección ip que aparece
para continuar se agrega un nuevo terminal y se ingresa a mysite con cd mysite
7. Creamos la app preguntas
python manage.py startapp preguntas
8. Escribe tu primera vista

En el archivo preguntas/views digitar el siguiente código

from django.http import HttpResponse

def index(request):

return HttpResponse("Hola, este es el index de la app


preguntas")

Se crea la carpeta urls.py en la carpeta preguntas y se digita el siguiente código

from django.urls import path

from . import views

urlpatterns = [

path('', views.index, name='index'),

En el archivo mysite/urls.py insetar las siguientes línea dentro de


urltterns [

path('preguntas/', include('preguntas.urls')),

importar la librería include

from django.urls import include, path


Se verifica que al ingresar a la url del servidor / preguntas, muestre le mensaje Hola, este
es el index de la app preguntas

CONFIGURACION DE LA BASE DE DATOS

1. Se verifica que en el archivo settings.py en la sección DATABASES se encuentre la línea


django.db.backends.sqlite3
2. Se migran las bases de datos preconfiguradas
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

Con el siguiente comando python manage.py migrate

3. Se crea la estructura de datos

En el archivo models.py en la carpeta preguntas digitamos el siguiente codigo

from django.db import models

class Pregunta(models.Model):

textopregunta= models.CharField(max_length=200)

fechapublicacion = models.DateTimeField('date published')

class Opciones(models.Model):

pregunta = models.ForeignKey(Pregunta, on_delete=models.CASCADE)


textoopcion = models.CharField(max_length=200)

votos = models.IntegerField(default=0)

Se agrega la siguiente línea en la sección INSTALLED APPS = del


achivo settings.py

'preguntas.apps.PreguntasConfig',

Lo anterior sale de la clase creada en el archivo apps.py de la carpeta preguntas

4. Se construye la base de datos del modelo

python manage.py makemigrations preguntas

Convertir los modelos a una estructura sql

python manage.py sqlmigrate preguntas 0001

Se crean todas las bases de datos con

python manage.py migrate

Ahora Podemos interactuar con la base de datos desde el Shell

python manage.py shell

from preguntas.models import Pregunta, Opciones

Pregunta.objects.all()

from django.utils import timezone

>>> q = Pregunta(textopregunta="Que hay de nuevo? ",


fechapublicacion=timezone.now())

q.save()

q.id
q.textopregunta

q.fechapublicacion

q.textopregunta = “Dime que hay de nuevo?”

q.save()

Pregunta.objects.all()

Creamos una función en models que me permita ver los valores


almacenados

En la clase Preguntas

def __str__(self):
return self.textopregunta

def was_published_recently(self):
return self.fechapublicacion >= timezone.now() -
datetime.timedelta(days=1)

En la clase opciones

def __str__(self):
return self.textoopcion

Hacemos los respectivos imports

import datetime

from django.utils import timezone

Se prueba de nuevo en el Shell

python manage.py shell

from preguntas.models import Pregunta, Opciones

Pregunta.objects.all()
Pregunta.objects.filter(id=1)

Pregunta.objects.filter(textopregunta__startswith='Nu')

from django.utils import timezone

>>> current_year = timezone.now().year

>>> Pregunta.objects.get(fechapublicacion__year=current_year)

Pregunta.objects.get(pk=1)

q = Pregunta.objects.get(pk=1)

q.was_published_recently()

>>> q = Pregunta.objects.get(pk=1)

>>> q.opciones_set.all()

<QuerySet []>

# Crear 3 opciones

>>> q.opciones_set.create(textoopcion='Opcion 1', votos=0)

>>> q.opciones_set.create(textoopcion='Opcion 2', votos=0)

>>> c = q.opciones_set.create(textoopcion='Opcion 3', votos=0)

>>> c.preguntas

#Ver todas las opciones

>>> q.opciones_set.all()

>>> q.opciones_set.count()

CREAR UN SUpER USUARIO

1. python manage.py createsuperuser

Ingresar usuario y contraseña

2. Se ejecuta el servidor

python manage.py runserver


se ingresa a la url /admin

3. Incluir la App preguntas en el admin

En la carpeta preguntas.admin.py agregamos lo siguiente

from django.contrib import admin

from .models import Pregunta

admin.site.register(Pregunta)

y se verifica que en el administrador aparezca en la interfaz de


usuario la opción preguntas

Modificiamos las vistas en el archivo preguntas/views.py

def detalle(request, pregunta_id):

return HttpResponse("Ud esta viendo la pregunta %s." %


pregunta_id)

def resultados(request, pregunta_id):

response = "Ud esta viendo los resultados de la pregunta %s."

return HttpResponse(response % pregunta_id)

def votos(request, pregunta_id):

return HttpResponse("Ustede esta votando en la pregunta %s."


% pregunta_id)

Modificamos el archivo preguntas/urls.py

path('<int:pregunta_id>/', views.detalle, name='detalle'),


path('<int:pregunta_id>/resultados/', views.resultados,
name='resultados'),
path('<int:pregunta_id>/votos/', views.votos, name='votos'),

Probamos la urls

127.0.0.1:8000/preguntas/1/

127.0.0.1:8000/preguntas/1/resultados/
127.0.0.1:8000/preguntas/1/votos

Hagamos que las vistas miestren el contenido de la bd

1. Se modifica preguntas.views.py asi

def index(request):
ultimaPreguntaDeLista = Pregunta.objects.order_by('-
fechapublicacion')[:5]
output = ', '.join([q.textopregunta for q in
ultimaPreguntaDeLista])
return HttpResponse(output)

2. Se ejecuta el server y se verifica que al cargar la url


correspondiente salga el mensaje

3. Se crea la carpeta templates y dentro de ella la carpeta


preguntas y allí un archivo index.html y se agrega el
siguiente código
{% if ultimaPreguntaDeLista %}
<ul>
{% for pregunta in ultimaPreguntaDeLista %}
<li><a href="/preguntas/{{ pregunta.id }}/">{{
pregunta.textopregunta }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}

4. Se modifica el archivo views.py de la carpeta preguntas así

def index(request):
ultimaPreguntaDeLista = Pregunta.objects.order_by('-
fechapublicacion')[:5]
template = loader.get_template('preguntas/index.html')
context = {
'ultimaPreguntaDeLista': ultimaPreguntaDeLista,
}
return HttpResponse(template.render(context, request))
#output = ', '.join([q.textopregunta for q in ultimaPreguntaDeLista])
#return HttpResponse(output)

se valida que en la vista se visualicen las preguntas de la


siguiente manera
EL archivo views.py también se puede modificar de la siguiente
manera obteniendo el mismo resultado

def index(request):
ultimaPreguntaDeLista = Pregunta.objects.order_by('-
fechapublicacion')[:5]
context = {'ultimaPreguntaDeLista': ultimaPreguntaDeLista}
return render(request, 'preguntas/index.html', context)

SE crear un archivo detalle.html en la carpeta templates/preguntas

SE digita lo siguiente en el archivo detalles.html

<h1>{{ pregunta.textopregunta }}</h1>


<ul>
{% for opciones in pregunta.opciones_set.all %}
<li>{{ opciones.textoopcion }}</li>
{% endfor %}
</ul>

Se modifica la función detalles en views.py de la siguiente manera

def detalle(request, pregunta_id):


pregunta = get_object_or_404(Pregunta, pk=pregunta_id)
return render(request, 'preguntas/detalle.html', {'pregunta':
pregunta})
#return HttpResponse("Ud esta viendo la pregunta %s." % pregunta_id)
Sobre urlpatterns en el archivo preguntas/urls.py

Agregamos la línea

app_name = 'preguntas'

y luego modificamos los en index.html de la siguiente manera

cambiamos

<li><a href="/preguntas/{{ pregunta.id }}/">{{ pregunta.textopregunta


}}</a></li>

Por

<li><a href="{% url 'preguntas:detalle' pregunta.id %}">{{


pregunta.textopregunta }}</a></li>

Modificamos el archivo detalle.html de la siguiente manera

<h1>{{ pregunta.textopregunta }}</h1>


<ul>
{% for opciones in pregunta.opciones_set.all %}
<li>{{ opciones.textoopcion }}</li>
{% endfor %}
</ul>

<form action="{% url 'preguntas:votos' pregunta.id %}" method="post">


{% csrf_token %}
<fieldset>
<legend><h1>{{ pregunta.textopregunta }}</h1></legend>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{%
endif %}
{% for opciones in pregunta.opciones_set.all %}
<input type="radio" name="opcion" id="opciones{{ forloop.counter
}}" value="{{ opciones.id }}">
<label for="opciones{{ forloop.counter }}">{{
opciones.textoopcion }}</label><br>
{% endfor %}
</fieldset>
<input type="submit" value="Voto">
</form>

Se modifica la función votos así

from django.http import HttpResponse, HttpResponseRedirect


from django.shortcuts import render, get_object_or_404
from django.template import loader
from django.urls import reverse

from .models import Pregunta, Opciones


def index(request):
ultimaPreguntaDeLista = Pregunta.objects.order_by('-
fechapublicacion')[:5]
context = {'ultimaPreguntaDeLista': ultimaPreguntaDeLista}
return render(request, 'preguntas/index.html', context)
'''template = loader.get_template('preguntas/index.html')
context = {
'ultimaPreguntaDeLista': ultimaPreguntaDeLista,
}
return HttpResponse(template.render(context, request))'''
#output = ', '.join([q.textopregunta for q in ultimaPreguntaDeLista])
#return HttpResponse(output)

def detalle(request, pregunta_id):


pregunta = get_object_or_404(Pregunta, pk=pregunta_id)
return render(request, 'preguntas/detalle.html', {'pregunta':
pregunta})
#return HttpResponse("Ud esta viendo la pregunta %s." % pregunta_id)

def resultados(request, pregunta_id):


response = "Ud esta viendo los resultados de la pregunta %s."
return HttpResponse(response % pregunta_id)

def votos(request, pregunta_id):


pregunta = get_object_or_404(Pregunta, pk=pregunta_id)
try:
selected_opcion =
pregunta.opciones_set.get(pk=request.POST['opcion'])
except (KeyError, Opciones.DoesNotExist):
# Redisplay the question voting form.
return render(request, 'preguntas/detalle.html', {
'pregunta': pregunta,
'error_message': "You didn't select a choice.",
})
else:
selected_opcion.votos += 1
selected_opcion.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('preguntas:resultados',
args=(pregunta.id,)))

modificamos la función resultados de la siguiente manera

def resultados(request, pregunta_id):

pregunta = get_object_or_404(Pregunta, pk=pregunta_id)


return render(request, 'preguntas/resultados.html', {'pregunta':
pregunta})

y se crea el archivo resultados.html con el siguiente contenido


<h1>{{ pregunta.textopregunta }}</h1>

<ul>
{% for opciones in pregunta.opciones_set.all %}
<li>{{ opciones.textoopcion }} -- {{ opciones.votos }} vote{{
opciones.votos|pluralize }}</li>
{% endfor %}
</ul>

<a href="{% url 'preguntas:detalle' pregunta.id %}">Vote de nuevo?</a>

También podría gustarte