Foros del Web » Programando para Internet » Python »

Django, Buenas practicas en vistas

Estas en el tema de Django, Buenas practicas en vistas en el foro de Python en Foros del Web. Buenas maestros, vengo con una pequeña duda a nivel de organización de las views en django Resulta que estoy haciendo un sistema donde se debe ...
  #1 (permalink)  
Antiguo 19/04/2012, 10:23
Avatar de minkweb  
Fecha de Ingreso: septiembre-2005
Mensajes: 443
Antigüedad: 18 años, 7 meses
Puntos: 14
Django, Buenas practicas en vistas

Buenas maestros, vengo con una pequeña duda a nivel de organización de las views en django

Resulta que estoy haciendo un sistema donde se debe registrar un apartamento y un usuario al mismo tiempo, he decidido dividir esto en 2 metodos registrar_usuario, registrar_apartamento.

Cuando se registra un apartamento se registra al mismo tiempo el usuario, ósea dentro de la funcion registrar_apartamento se llama a la funcion registrar_usuario, dejo un código algo pobre para hacer un ejemplo

Código:
def registrar_usuario(request):
	#creando usuario
	usuario = User.objects.create_user();
	return usuario

def registrar_apartamento(request):
	#creando usuario
	usuario = registrar_usuario(request)
	#registrando apartamento
	return HttpResponse('apartamento registrado')
Mas o menos así iría, así seria el funcionamiento..
Mi duda es la siguiente

la funcion registrar_usuario no devuelve un HttpResponse, pero
¿Que pasa si mas adelante necesito que lo haga?, por ejemplo, mas adelante necesito hacer un registro de usuario sin apartamento, tener otra función seria redundar el código
¿La forma correcta de hacerlo es con un if, si un parámetro es True retorne HttpResponse si es False retorne un Diccionario?

Con esto me refiero a que, en views.py están las funciones que "renderizan" los templates, pero las funciones que tienen mas lógica o procesos mas pesado donde deberían ir?
__________________
Juegos
Juegos iphone
  #2 (permalink)  
Antiguo 19/04/2012, 19:28
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Django, Buenas practicas en vistas

Voy hacer algunas cuantas criticas acerca del código.

1.- No uses tabs, usa espacios (de preferencia 4 espacios).
¿Porque? Bueno tiene varios motivos, pero el mas sobresale
es que los tabs no se ven igual en todos los editores haciendo esto
algo incomodo.

2.- No uses ; no es necesario en python.
Si, si puedes usar ; lo puedes hacer pero, es feo.

3.- En la funcion registrar_usuario, nunca haces uso del parámetro request, entonces no necesita ese parámetro.

Código:
def registrar_usuario(request):
	#creando usuario
	usuario = User.objects.create_user();
	return usuario

def registrar_apartamento(request):
	#creando usuario
	usuario = registrar_usuario(request)
	#registrando apartamento
	return HttpResponse('apartamento registrado')

Cita:
Iniciado por minkweb Ver Mensaje
Resulta que estoy haciendo un sistema donde se debe registrar un apartamento y un usuario al mismo tiempo, he decidido dividir esto en 2 metodos registrar_usuario, registrar_apartamento.
Hasta aquí vas bien.

Cita:
Iniciado por minkweb Ver Mensaje
Cuando se registra un apartamento se registra al mismo tiempo el usuario, ósea dentro de la funcion registrar_apartamento se llama a la funcion registrar_usuario, dejo un código algo pobre para hacer un ejemplo
¿Que tal si ya tengo un usuario registrado?

Cita:
Iniciado por minkweb Ver Mensaje
Mas o menos así iría, así seria el funcionamiento..
Nunca programes sobre un mas o menos. Por ejemplo, no saber como o que se va a hacer es un buen ejemplo de un 'mas o menos'. En cambio si el cliente te dice mas o menos que es lo quiere entonces, tienes que llenar esos huecos para poder programar algo.

Cita:
Iniciado por minkweb Ver Mensaje
la funcion registrar_usuario no devuelve un HttpResponse, pero
¿Que pasa si mas adelante necesito que lo haga?, por ejemplo, mas adelante necesito hacer un registro de usuario sin apartamento, tener otra función seria redundar el código
Entonces necesitas hacer una vista. Que llame a la función que registre el usuario.

Cita:
Iniciado por minkweb Ver Mensaje
¿La forma correcta de hacerlo es con un if, si un parámetro es True retorne HttpResponse si es False retorne un Diccionario?
No, de hecho, es probablemente una de las peores formas. Por que el tipo de retorno depende en los parámetros que reciba. Ademas que generas mas dependencias (tightly coupled).

Cita:
Iniciado por minkweb Ver Mensaje
Con esto me refiero a que, en views.py están las funciones que "renderizan" los templates, pero las funciones que tienen mas lógica o procesos mas pesado donde deberían ir?
Depende del tipo lógica es donde lo colocas.

Si es lógica con respecto a los Modelos entonces debería ir en los modelos. (Ejemplo: Si tengo algún Modelo llamado Worker y quiero saber si trabajo hoy o no, puedo hacer un método llamado worked_today, o mejor si quiero saber si trabajo algún día en especifico puedo hacer una función worked que reciba como parámetro una fecha.)

Si es lógica de como se muestra el contenido entonces debería ir en los templates (Por ejemplo colorear las filas impares de un color y las pares de otro).

Lo que haces en las vistas (o views) debería ser un puente entre los templates y los modelos. Tal como lo sugiere el modelo MVC (segun el modelo mvc, la vista seria un template y el controlador una vista).
  #3 (permalink)  
Antiguo 20/04/2012, 09:47
Avatar de minkweb  
Fecha de Ingreso: septiembre-2005
Mensajes: 443
Antigüedad: 18 años, 7 meses
Puntos: 14
Respuesta: Django, Buenas practicas en vistas

Gracias por tu respuesta @razpeitia

Bueno, referente a
Cita:
Mas o menos así iría, así seria el funcionamiento..
Lo tengo diferente en mi proyecto, ese código que coloqué es solo como ejemplo de lo que haria las funciones, tampoco tengo ";" fue un error aquí en el foro, es costumbre cuando vienes de PHP

Ahora bien, luego de leer tus respuestas entendí esto:
Las funciones de registro en base de datos van en sus respectivos Modelos (models.py)
Las funciones de validación de formularios y renderizado de templates va en vistas (views.py)
Debo evitar dependencias entre funciones, ósea lograr un bajo acoplamiento mejorando la reutilización de código

Tengo otra pregunta con respecto a buenas prácticas.
Si quiero hacer un "helper" personalizado, digamos un script de paginación, pero debo hacerlo desde 0 ósea que no puedo usar algo que ya esté desarrollado. Donde lo desarrollo? ¿en que carpeta debería ir para que pueda ser utilizado por todos los apps de mi proyecto?

Gracias
__________________
Juegos
Juegos iphone
  #4 (permalink)  
Antiguo 20/04/2012, 11:21
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Django, Buenas practicas en vistas

Cita:
Iniciado por minkweb Ver Mensaje
Ahora bien, luego de leer tus respuestas entendí esto:
Las funciones de registro en base de datos van en sus respectivos Modelos (models.py)
Las funciones de validación de formularios y renderizado de templates va en vistas (views.py)
Debo evitar dependencias entre funciones, ósea lograr un bajo acoplamiento mejorando la reutilización de código
Si todo bien, excepto si quieres validar formularios deberías ponerlos en los formularios y no en la vista. La vista te sirve para unir varios elementos.

Cita:
Iniciado por minkweb Ver Mensaje
Si quiero hacer un "helper" personalizado, digamos un script de paginación, pero debo hacerlo desde 0 ósea que no puedo usar algo que ya esté desarrollado.
¿Por que no puedes utilizar algo que ya esta desarrollado?
Eso sería trabajar doble. Utilizas mas tiempo y puede que sea propenso a errores por que lo estas haciendo desde 0.
Si te interesa django provee un paginador.

Cita:
Iniciado por minkweb Ver Mensaje
Donde lo desarrollo? ¿en que carpeta debería ir para que pueda ser utilizado por todos los apps de mi proyecto?
Tienes que crear una app que sea un paginador para que pueda ser utilizado por otras app.

Etiquetas: django, views
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:00.