miércoles, 24 de enero de 2018

Formularios y Reducción de Código en Django

FORMULARIOS 

Los formularios en Django cuentan con un token de seguridad interno. en el siguiente código lo podemos observar:

<h1>{{ question.question_text }}</h1>

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>
Agregando el código {% csrf_token %} podemos tener seguridad en nuestros formularios brindada por Django. 

Para recibir los datos modificamos la vista vote en el archivo polls/views.py

def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        # Redisplay the question voting form.
        return render(request, 'polls/detail.html', {
            'question': question,
            'error_message': "You didn't select a choice.",
        })
    else:
        selected_choice.votes += 1
        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=(question.id,)))

la excepción KeyError capturara una excepción en el caso que POST['choice'] se encuentre vacío.
La función HttpResponseRedirect nos sirve para enviar solo la url sin necesidad de mandar el diccioanrio y la variable request como se necesita en HttpResponse.
La función reverse nos ayuda a configuar nuestra url, ne el ejemplo esta funcion devolveria la cadena: 'polls/3/results/' 
NOTA: para eliminar problemas de concurrencia investigar sobre avoiding-race-conditions-using-f.

Reducción de Código
Como las vistas index, detail y result con parecidas, consultan la pregunta y envían la información, Django provee de dos funcionalidades potentes, DetailView y ListView, para adicionarlas realizaremos lo siguiente:
1. modificamos las rutas en el archivo polls/urls.py para que queden de la siguiente forma:
 path('', views.IndexView.as_view(), name='index')
     path('<int:pk>',views.DetailView.as_view(), name='detail')
path('<int:pk>/results/',views.ResultsView.as_view(), name='results') path('<int:question_id>/vote/',views.vote,name='vote')

2. modificamos las vistas en el archivo polls.view.py para que queden de la siguiente forma:

class IndexView(generic.ListView):
 template_name = 'polls/index.html'
 context_object_name = 'latest_question_list'
 
 def get_queryset(def)
  return Question.objects.order_by('-pub_date')[:5]
class DetailView(generic.DetailView):
 model = Question
 template_name = 'polls/detail.html'

class ResultsView(generic.DetailView)
 model = Question
 template_name = 'polls/results.html'
esto haría el mismo efecto de como teníamos el código anteriormente.


martes, 23 de enero de 2018

Configurando Vistas, Rutas y Plantillas en Django

Vistas

Las vistas en Django son funciones que pueden traer o no información de la base de datos, un ejemplo de vista es la siguiente:

def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:
context = {'latest_question_list': latest_question_list}
return render(request,'polls/index.html',context)

para validar que la informacion de la base de datos no se envié vacía, django tiene los métodos get_object_or_404 y get_list_or_404, un ejemlpo de este tipo de métodos es:

def detail(request,question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request,'polls/detail.html',{'question':question})

Rutas

Las rutas se les puede definir un nombre para que se diferencien de las rutas de las otras aplicaciones  en el proyecto y sea mas fácil su modificación  , el nombre se define con la linea:

app_name = 'polls'

y para agregar una nueva ruta podemos utilizar la siguiente sintaxis:

 path('<int:question_id>/',views.detail,name='detail'),

estas configuraciones se hacen en el archivo ubicado en polls/urls.py  y en el archivo mysitio/urls.py  se configura con el método include, esto sirve para llamar todas las rutas definidas en polls/urls.py, el método include quedaría de la siguiente forma:

from django.urls import include,path
path('polls/',include('polls.urls')),

Plantillas 

para invocar una ruta desde la plantilla utilizando el nombre que se definió, se utiliza el siguiente código:

<li><a href="{% url 'polls:detail' question_id %}">{{question.question_text}}</a></li>

un ejemplo de la potencia de las plantillas de django lo podemos observar en el siguiente código:

<h1>{{question.question_text}}</h1>
<ul>
{%for choice in question.choice_set.all%}
<li>{{choice.choice_text}}</li>
{%endfor%}
</ul>

el cual realiza un inner join en la vista y trae la información tanto de la pregunta como de las opciones con solo la linea for choice in question.choice_set.all







Administrador de Django

1. Primero creamos el usuario administrador con el siguiente comando:

python manage.py createsuperuser

nos pedirá que ingresemos el nombre, correo y la clave. 

2. ponemos a correr el servidor con el comando:

python manage.py runserver

3. y luego ingresamos al link: localhost:8000/admin, ingresamos el usuario y contraseña que creamos en el paso 1.

4. Ahora para que nuestra aplicación salga en el admin modificamos el archivo polls/admin.py, agregando las siguientes lineas:

from .models import Question 

admin.site.register(Question)



lunes, 22 de enero de 2018

Conectar con Mysql en Django

1. Nos aseguramos que este instalado el Visual C++ 2015 en nuestro equipo, sino lo descargamos del siguiente link : http://landinghub.visualstudio.com/visual-cpp-build-tools.

2. Luego ejecutamos los  siguientes comandos para instalar los  controladores de Mysql:

pip install pymysql 
pip install mysqlclient

3. Configuramos el archivo settings.py, precisamente en la tupla DATABASES, en el atributo ENGINE indicamos el valor django.db.backends.mysql en el atributo NAME ingresamos el nombre de la base de datos, y ademas agregamos los atributos USER, PASSWORD y HOST con sus respectivos valores. 

4. Luego de realizar todas las configuraciones ejecutamos el comando:

    python manage.py migrate 

y al revisar nuestra base de datos podemos observar que django creo sus tablas predeterminadas.

5. Para crear Nuestras Propias tablas en la base de datos, modificamos el archivo models.py que se encuentra en nuestra aplicación, en este ejemplo cree la aplicación polls, y agregarnos el siguiente código:

class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')

class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)

votes = models.IntegerField(default = 0)

6. Posteriormente incluimos nuestra aplicación en el archivo settings.py en la tupla INSTALLED_APPS, agregando la linea 'polls.apps.PollsConfig',


7. luego ejecutamos el comando:

python manage.py makemigrations polls

y esto generara un archivo en la carpeta migrations  ubicada en nuestra aplicación con todas los detalles de la configuración que se creara en la base de datos, en esta podemos hacer todas las modificaciones que creamos pertinentes.

7.1. Luego podemos ejecutar el comando:

python manage.py sqlmigrate polls 0001 

esto nos mostrara las consultas sql que se migraran a nuestra base de datos, pero no las migrara 

8. para finalizar nuestra migración ejecutamos nuevamente el comando:

python manage.py migrate







lunes, 15 de enero de 2018

Hola mundo en Django

1. Una vez que este instalado Python, instalamos Django, ingresando en la terminal el siguiente comando (todos los comandos son para la versión de python 3.6 y django 2.0.1)
    
   pip install django

2. Para crear el nuevo proyecto, el comando:

    django-admin.py startproject holamundo

ubicándose en la carpeta que se desea crear el proyecto

3. entramos en la carpeta que se creo del proyecto con:

     cd holamundo

4. creamos la primera aplicación con el comando:

     python manage.py startapp saludo

5. migramos las apps necesarias para que funcione nuestro proyecto

     python manage.py migrate

6. iniciamos el servidor con el comando:

     python manage.py runserver

7. En el archivo setting.py agregamos en la tupla INSTALLET_APPS la nueva app que en este caso es 'saludo'

8. Creamos una carpeta o directorio en la raíz del proyecto llamada templates y modificamos el archivo setting.py en la tupla TEMPLATES modificamos el siguiente item 'DIRS':[BASE_DIR+"/templates"]

9. Agregamos una nueva url en el archivo urls.py, de la siguiente forma: url(r'^holamundo/$', saludo, name='saludo'), ademas incluimos la vista y la app para crear url, de la forma:
from saludo.views import saludo

from django.conf.urls import include, url

10. Se crea la función para saludar en saludo/views.py de la siguiente forma:
      def saludo(request):
          context = {'saludo':'Hello World','Autor':'Richard'}
          return render(request,'saludo.html',context)
La funcion render se incluye por defecto en el archivo views.py y la funcion saludo es la que llamamos en el archivo urls.py 

11. creamos el archivo saludo.html en la carpeta templates con el siguiente código:
     <html>
          <head>
              <title>Hello World con Django</title>
          </head>
          <body>
               {{ saludo }} 
               <br>Autor:{{ autor }}<br>
          </body>
    </html>

12. Vuelve a iniciar el servidor con:

     python manage.py runserver

13. Para ver la aplicación nos dirigimos a la dirección:  http://127.0.0.1:8000/holamundo