Solo voy a comenzar con un consejo mío :)
Use os.path.dirname () en settings.py para evitar nombres de directorio codificados.
No codifique la ruta en su settings.py si desea ejecutar su proyecto en diferentes ubicaciones. Use el siguiente código en settings.py si sus plantillas y archivos estáticos se encuentran dentro del directorio del proyecto Django:
# settings.py
import os
PROJECT_DIR = os.path.dirname(__file__)
...
STATIC_DOC_ROOT = os.path.join(PROJECT_DIR, "static")
...
TEMPLATE_DIRS = (
os.path.join(PROJECT_DIR, "templates"),
)
Créditos: Recibí este consejo del screencast ' Django From the Ground Up '.
j = lambda filename: os.path.join(PROJECT_DIR, filename)
. Entonces solo necesitas escribirj("static")
.wontfix
decisión.Instale Extensiones de comando Django y pygraphviz y luego emita el siguiente comando para obtener una visualización del modelo Django realmente agradable:
fuente
Utilice el
render_to
decorador de django-molesto en lugar derender_to_response
.Editado para señalar que devolver un HttpResponse (como una redirección) provocará un cortocircuito en el decorador y funcionará tal como espera.
fuente
Hay un conjunto de etiquetas personalizadas que uso en todas las plantillas de mi sitio. Buscando una manera de cargarlo automáticamente (SECO, ¿recuerdas?), Encontré lo siguiente:
Si coloca esto en un módulo que se carga de forma predeterminada (su urlconf principal, por ejemplo), tendrá las etiquetas y los filtros de su módulo de etiquetas personalizadas disponibles en cualquier plantilla, sin usar
{% load custom_tag_module %}
.El argumento pasado a
template.add_to_builtins()
puede ser cualquier ruta de módulo; su módulo de etiqueta personalizada no tiene que vivir en una aplicación específica. Por ejemplo, también puede ser un módulo en el directorio raíz de su proyecto (por ejemplo'project.custom_tag_module'
).fuente
Virtualenv + Python = salvavidas si está trabajando en múltiples proyectos de Django y existe la posibilidad de que no dependan de la misma versión de Django / una aplicación.
fuente
virtualenv myNewEnv --no-site-packages
;. myNewEnv/bin/activate
;pip install django
; ¡Y simplemente funciona!¡No codifiques tus URLs!
Utilice nombres de URL en su lugar y la
reverse
función para obtener la URL en sí.Cuando defina sus asignaciones de URL, asigne nombres a sus URL.
Asegúrese de que el nombre sea único por URL.
Por lo general, tengo un formato consistente "project-appplication-view", por ejemplo, "cbx-forum-thread" para una vista de hilo.
ACTUALIZACIÓN (robando descaradamente la adición de ayaz ):
Este nombre se puede usar en plantillas con la
url
etiqueta .fuente
url
etiqueta ... Su postura es que las URL no deberían cambiar de todos modos (si quieres ser amigable con tu usuarios).{% url path.to.view.name arg1 arg2 %}
docs.djangoproject.com/en/dev/ref/templates/builtins/…reverse
asíenvironment.filters['url'] = django.core.urlresolvers.reverse
y puede usarlo en sus plantillas de la siguiente manera:{{ 'view-name'|url(arg1, arg2)|e }}
(la "e" es necesaria para escapar de algunos caracteres para su inclusión en HTML)Utilice la barra de herramientas de depuración de django . Por ejemplo, permite ver todas las consultas SQL realizadas mientras se visualiza la vista y también puede ver el seguimiento de pila para cualquiera de ellas.
fuente
No escriba sus propias páginas de inicio de sesión. Si está utilizando django.contrib.auth.
El secreto real y sucio es que si también usa django.contrib.admin y django.template.loaders.app_directories.load_template_source está en sus cargadores de plantillas, ¡ también puede obtener sus plantillas gratis!
fuente
Los procesadores de contexto son increíbles.
Supongamos que tiene un modelo de usuario diferente y desea incluirlo en cada respuesta. En lugar de hacer esto:
Los procesos de contexto le brindan la posibilidad de pasar cualquier variable a sus plantillas. Normalmente pongo el mío en
'my_project/apps/core/context.py
:En tus
settings.py
agregar la siguiente línea a suTEMPLATE_CONTEXT_PROCESSORS
Ahora, cada vez que se realiza una solicitud, incluye la
my_user
clave automáticamente.también señala victoria.
Escribí una publicación de blog sobre esto hace unos meses, así que voy a cortar y pegar:
Fuera de la caja, Django te da varias señales que son increíblemente útiles. Tiene la capacidad de hacer cosas antes y después de guardar, iniciar, eliminar o incluso cuando se procesa una solicitud. Entonces, alejémonos de los conceptos y demostremos cómo se usan. Digamos que tenemos un blog
Entonces, de alguna manera, desea notificar a uno de los muchos servicios de ping-blog que hemos hecho una nueva publicación, reconstruir el caché de publicaciones más recientes y twittear al respecto. Bueno, con las señales tienes la capacidad de hacer todo esto sin tener que agregar ningún método a la clase Post.
Ahí vamos, definiendo esa función y usando la señal post_init para conectar la función al modelo Post y ejecutarla después de que se haya guardado.
fuente
Cuando estaba comenzando, no sabía que había un Paginador , ¡¡¡asegúrate de saber de su existencia !!
fuente
Use IPython para saltar a su código en cualquier nivel y depurar usando el poder de IPython. Una vez que haya instalado IPython, simplemente coloque este código donde desee depurar:
Luego, actualice la página, vaya a la ventana de su servidor de ejecución y se encontrará en una ventana interactiva de IPython.
Tengo un fragmento configurado en TextMate, así que solo escribo ipshell y presiono la pestaña. No podría vivir sin eso.
fuente
ipdb
y luego simplemente escribaipdb.set_trace()
Ejecute un servidor SMTP de desarrollo que solo generará lo que se le envíe (si no desea instalar SMTP en su servidor de desarrollo).
línea de comando:
fuente
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
..que imprimirá el correo electrónico a lamanage.py
salida.De la documentación de django-admin :
Si usa el shell Bash, considere instalar el script de finalización de bash de Django, que se encuentra
extras/django_bash_completion
en la distribución de Django. Permite completar tabulacionesdjango-admin.py
ymanage.py
comandos, por lo que puede, por ejemplo ...django-admin.py
.sql
, luego [TAB], para ver todas las opciones disponibles cuyos nombres comienzan consql
.fuente
La
./manage.py runserver_plus
facilidad que viene con django_extensions es realmente increíble.Crea una página de depuración mejorada que, entre otras cosas, utiliza el depurador Werkzeug para crear consolas de depuración interactivas para cada punto de la pila (ver captura de pantalla). También proporciona un método de depuración de conveniencia muy útil
dump()
para mostrar información sobre un objeto / marco.Para instalar, puedes usar pip:
Luego agregue
'django_extensions'
a suINSTALLED_APPS
tuplasettings.py
e inicie el servidor de desarrollo con la nueva extensión:Esto cambiará la forma de depurar.
fuente
Me gusta usar el depurador Python pdb para depurar proyectos de Django.
Este es un enlace útil para aprender a usarlo: http://www.ferg.org/papers/debugging_in_python.html
fuente
Al intentar intercambiar datos entre Django y otra aplicación,
request.raw_post_data
es un buen amigo. Úselo para recibir y procesar a medida, por ejemplo, datos XML.Documentación: http://docs.djangoproject.com/en/dev/ref/request-response/
fuente
Usa Jinja2 junto a Django.
Si encuentra que el lenguaje de plantillas de Django es extremadamente restrictivo (¡como yo!), Entonces no tiene que quedarse atrapado en él. Django es flexible, y el idioma de la plantilla está acoplado libremente al resto del sistema, ¡así que simplemente conecte otro idioma de plantilla y úselo para presentar sus respuestas http!
Yo uso Jinja2 , es casi como una versión mejorada del lenguaje de plantillas django, usa la misma sintaxis y te permite usar expresiones en declaraciones if. no más hacer etiquetas if personalizadas como
if_item_in_list
! simplemente puedes decir%{ if item in list %}
, o{% if object.field < 10 %}
.Pero eso no es todo; tiene muchas más funciones para facilitar la creación de plantillas, que no puedo ver todas aquí.
fuente
Agregue
assert False
su código de vista para volcar la información de depuración.fuente
5 / 0
me uso . ¿Por que cinco? Ni idea.Esto se suma a la respuesta anterior sobre los nombres de URL de Django y el envío inverso de URL .
Los nombres de URL también se pueden usar de manera efectiva dentro de las plantillas. Por ejemplo, para un patrón de URL dado:
puede tener lo siguiente en plantillas:
fuente
Dado que las "vistas" de Django solo necesitan ser invocables que devuelvan un HttpResponse, puede crear fácilmente vistas basadas en clases como las de Ruby on Rails y otros marcos.
Hay varias formas de crear vistas basadas en clases, aquí está mi favorito:
Puede agregar todo tipo de otras cosas, como el manejo de solicitudes condicionales y la autorización en su vista base.
Una vez que haya configurado sus vistas, su urls.py se verá así:
fuente
En lugar de usar
render_to_response
para vincular su contexto a una plantilla y renderizarla (que es lo que suelen mostrar los documentos de Django), use la vista genéricadirect_to_template
. Hace lo mismo querender_to_response
hace, pero también agrega automáticamente RequestContext al contexto de la plantilla, permitiendo implícitamente el uso de procesadores de contexto. Puede hacerlo manualmente usandorender_to_response
, pero ¿por qué molestarse? Es solo otro paso para recordar y otro LOC. Además de utilizar procesadores de contexto, tener RequestContext en su plantilla le permite hacer cosas como:lo cual es muy útil. De hecho, +1 en vistas genéricas en general. Los documentos de Django los muestran principalmente como accesos directos para ni siquiera tener un archivo views.py para aplicaciones simples, pero también puedes usarlos dentro de tus propias funciones de vista:
fuente
render
método de acceso directo de Django 1.3 ( docs.djangoproject.com/en/dev/topics/http/shortcuts/#render )No tengo suficiente reputación para responder al comentario en cuestión, pero es importante tener en cuenta que si vas a usar Jinja , NO admite el carácter '-' en los nombres de bloque de plantilla, mientras que Django sí. Esto me causó muchos problemas y desperdicié el tiempo tratando de rastrear el muy oscuro mensaje de error que generó.
fuente
La aplicación de diseño web es muy útil al comenzar a diseñar su sitio web. Una vez importado, puede agregar esto para generar texto de muestra:
fuente
django.db.models.get_model
le permite recuperar un modelo sin importarlo.James muestra lo útil que puede ser: "Consejos de Django: escriba mejores etiquetas de plantilla - Iteración 4" .
fuente
Todo el mundo sabe que hay un servidor de desarrollo que puedes ejecutar con "manage.py runserver", pero ¿sabías que también hay una vista de desarrollo para servir archivos estáticos (CSS / JS / IMG)?
Los recién llegados siempre están desconcertados porque Django no viene con ninguna forma de servir archivos estáticos. Esto se debe a que el equipo de desarrollo piensa que es el trabajo para un servidor web de la vida real.
Pero al desarrollar, es posible que no desee configurar Apache + mod_wisgi, es pesado. Luego puede agregar lo siguiente a urls.py:
Su CSS / JS / IMG estará disponible en www.yoursite.com/site_media/.
Por supuesto, no lo use en un entorno de producción.
fuente
Aprendí este de la documentación de las miniaturas de sorl aplicación . Puede usar la palabra clave "como" en las etiquetas de plantilla para usar los resultados de la llamada en otra parte de su plantilla.
Por ejemplo:
Esto se menciona al pasar la documentación de Django templatetag, pero solo en referencia a los bucles. No dicen que puedes usar esto en otro lugar (¿en algún lugar?) También.
fuente
django.views.generic.list_detail.object_list : proporciona todas las variables lógicas y de plantilla para la paginación (una de esas borracheras que he escrito mil veces ahora). Envolverlo permite cualquier lógica que necesite. Esta gema me ha ahorrado muchas horas de depuración de errores fuera de uno en mis páginas de "Resultados de búsqueda" y hace que el código de vista sea más limpio en el proceso.
fuente
PyCharm IDE es un entorno agradable para codificar y especialmente depurar, con soporte integrado para Django.
fuente
Usa xml_models para crear modelos de Django que usen un backend API XML REST (en lugar de uno SQL). Esto es muy útil, especialmente al modelar API de terceros: obtienes la misma sintaxis de QuerySet a la que estás acostumbrado. Puede instalarlo desde PyPI.
XML de una API:
Y ahora en python:
También puede manejar relaciones y colecciones. Lo usamos todos los días en código de producción muy utilizado, por lo que, aunque es beta, es muy útil. También tiene un buen conjunto de talones que puede usar en sus pruebas.
(Descargo de responsabilidad: aunque no soy el autor de esta biblioteca, ahora soy un committer, después de haber realizado algunos commits menores)
fuente
Usar migraciones de bases de datos. Usa el sur .
fuente