Je vais juste commencer par un conseil de moi-même :)
Utilisez os.path.dirname () dans settings.py pour éviter les noms de répertoire codés en dur.
Ne codez pas en dur le chemin d'accès dans votre settings.py si vous souhaitez exécuter votre projet à différents endroits. Utilisez le code suivant dans settings.py si vos modèles et fichiers statiques se trouvent dans le répertoire du projet 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édits: J'ai obtenu cette astuce du screencast ' Django From the Ground Up '.
j = lambda filename: os.path.join(PROJECT_DIR, filename)
. Ensuite, il vous suffit de taperj("static")
.wontfix
décision.Installez les extensions de commande Django et pygraphviz , puis exécutez la commande suivante pour obtenir une visualisation de modèle Django très agréable:
la source
Utilisez le
render_to
décorateur de django-ennuyeux au lieu derender_to_response
.Modifié pour souligner que le retour d'une réponse HttpResponse (telle qu'une redirection) court-circuitera le décorateur et fonctionnera comme prévu.
la source
Il y a un ensemble de balises personnalisées que j'utilise partout dans les modèles de mon site. Vous cherchez un moyen de le charger automatiquement (SEC, rappelez-vous?), J'ai trouvé ce qui suit:
Si vous placez cela dans un module qui est chargé par défaut (votre URL principale par exemple), vous aurez les balises et les filtres de votre module de balises personnalisées disponibles dans n'importe quel modèle, sans utiliser
{% load custom_tag_module %}
.L'argument passé à
template.add_to_builtins()
peut être n'importe quel chemin de module; votre module de balise personnalisé ne doit pas nécessairement vivre dans une application spécifique. Par exemple, il peut également s'agir d'un module dans le répertoire racine de votre projet (par exemple.'project.custom_tag_module'
).la source
Virtualenv + Python = économiseur de vie si vous travaillez sur plusieurs projets Django et qu'il est possible qu'ils ne dépendent pas tous de la même version de Django / d'une application.
la source
virtualenv myNewEnv --no-site-packages
;. myNewEnv/bin/activate
;pip install django
; Et ça marche!Ne codez pas en dur vos URL!
Utilisez plutôt les noms d'URL et la
reverse
fonction pour obtenir l'URL elle-même.Lorsque vous définissez vos mappages d'URL, donnez des noms à vos URL.
Assurez-vous que le nom est unique par URL.
J'ai généralement un format cohérent "project-appplication-view", par exemple "cbx-forum-thread" pour une vue de thread.
MISE À JOUR (volant sans vergogne l'ajout d'ayaz ):
Ce nom peut être utilisé dans les modèles avec la
url
balise .la source
url
tag ... Sa position est que les URL ne devraient pas changer de toute façon (si vous voulez être amical avec votre utilisateurs).{% url path.to.view.name arg1 arg2 %}
docs.djangoproject.com/en/dev/ref/templates/builtins/…reverse
cecienvironment.filters['url'] = django.core.urlresolvers.reverse
et vous pouvez l'utiliser dans vos modèles comme ceci:{{ 'view-name'|url(arg1, arg2)|e }}
(le "e" est nécessaire pour échapper certains caractères à inclure dans HTML)Utilisez la barre d'outils de débogage django . Par exemple, il permet d'afficher toutes les requêtes SQL effectuées lors du rendu de la vue et vous pouvez également afficher la trace de pile pour chacune d'entre elles.
la source
N'écrivez pas vos propres pages de connexion. Si vous utilisez django.contrib.auth.
Le vrai et sale secret est que si vous utilisez également django.contrib.admin et que django.template.loaders.app_directories.load_template_source se trouve dans vos chargeurs de modèles, vous pouvez également obtenir vos modèles gratuitement!
la source
Les processeurs de contexte sont géniaux.
Supposons que vous ayez un modèle d'utilisateur différent et que vous souhaitiez l'inclure dans chaque réponse. Au lieu de faire ceci:
Les processus contextuels vous permettent de transmettre n'importe quelle variable à vos modèles. Je mets généralement le mien dans
'my_project/apps/core/context.py
:Dans votre,
settings.py
ajoutez la ligne suivante à votreTEMPLATE_CONTEXT_PROCESSORS
Désormais, chaque fois qu'une demande est faite, elle inclut
my_user
automatiquement la clé.Signale également la victoire.
J'ai écrit un article à ce sujet il y a quelques mois, donc je vais juste copier-coller:
Hors de la boîte Django vous donne plusieurs signaux qui sont incroyablement utiles. Vous avez la possibilité de faire des choses avant et après l'enregistrement, l'initialisation, la suppression ou même lorsqu'une demande est en cours de traitement. Permet donc de s'éloigner des concepts et de montrer comment ils sont utilisés. Disons que nous avons un blog
Donc, d'une manière ou d'une autre, vous souhaitez informer l'un des nombreux services de ping de blog que nous avons créé un nouveau message, reconstruire le cache des messages les plus récents et tweeter à ce sujet. Eh bien, avec les signaux, vous avez la possibilité de faire tout cela sans avoir à ajouter de méthodes à la classe Post.
Nous y voilà, en définissant cette fonction et en utilisant le signal post_init pour connecter la fonction au modèle Post et l'exécuter après l'avoir enregistrée.
la source
Quand je commençais, je ne savais pas qu'il y avait un Paginator , assurez-vous de connaître son existence !!
la source
Utilisez IPython pour accéder à votre code à n'importe quel niveau et déboguer en utilisant la puissance d'IPython. Une fois que vous avez installé IPython, placez simplement ce code là où vous voulez déboguer:
Ensuite, actualisez la page, allez dans votre fenêtre runserver et vous serez dans une fenêtre IPython interactive.
J'ai un extrait de code mis en place dans TextMate donc je tape juste ipshell et appuie sur tab. Je ne pourrais pas vivre sans ça.
la source
ipdb
et puis tapez simplementipdb.set_trace()
Exécutez un serveur SMTP de développement qui ne fera que sortir tout ce qui lui est envoyé (si vous ne voulez pas réellement installer SMTP sur votre serveur de développement.)
ligne de commande:
la source
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
.. qui imprimera l'e-mail à lamanage.py
sortie.Depuis la documentation de django-admin :
Si vous utilisez le shell Bash, envisagez d'installer le script d'achèvement de bash Django, qui réside
extras/django_bash_completion
dans la distribution Django. Il permet la complétion par tabulation des commandesdjango-admin.py
etmanage.py
, vous pouvez donc, par exemple ...django-admin.py
.sql
, puis [TAB], pour voir toutes les options disponibles dont les noms commencent parsql
.la source
La
./manage.py runserver_plus
facilité qui vient avec django_extensions est vraiment géniale.Il crée une page de débogage améliorée qui, entre autres, utilise le débogueur Werkzeug pour créer des consoles de débogage interactives pour chaque point de la pile (voir capture d'écran). Il fournit également une méthode de débogage pratique très utile
dump()
pour afficher des informations sur un objet / cadre.Pour installer, vous pouvez utiliser pip:
Ajoutez ensuite
'django_extensions'
à votreINSTALLED_APPS
tuplesettings.py
et démarrez le serveur de développement avec la nouvelle extension:Cela va changer la façon dont vous déboguez.
la source
J'aime utiliser le débogueur Python pdb pour déboguer des projets Django.
Il s'agit d'un lien utile pour apprendre à l'utiliser: http://www.ferg.org/papers/debugging_in_python.html
la source
Lorsque vous essayez d'échanger des données entre Django et une autre application,
request.raw_post_data
c'est un bon ami. Utilisez-le pour recevoir et traiter, par exemple, des données XML.Documentation: http://docs.djangoproject.com/en/dev/ref/request-response/
la source
Utilisez Jinja2 aux côtés de Django.
Si vous trouvez le langage de gabarit Django extrêmement restrictif (comme moi!), Alors vous n'avez pas à vous en tenir à lui. Django est flexible, et le langage de modèle est vaguement couplé au reste du système, alors il suffit de brancher un autre langage de modèle et de l'utiliser pour rendre vos réponses http!
J'utilise Jinja2 , c'est presque comme une version optimisée du langage de modèle django, il utilise la même syntaxe et vous permet d'utiliser des expressions dans les instructions if! plus besoin de faire des if-tags personnalisés comme
if_item_in_list
! vous pouvez simplement dire%{ if item in list %}
, ou{% if object.field < 10 %}
.Mais ce n'est pas tout; il a beaucoup plus de fonctionnalités pour faciliter la création de modèles, que je ne peux pas parcourir tous ici.
la source
Ajoutez
assert False
votre code d'affichage pour vider les informations de débogage.la source
5 / 0
. Pourquoi cinq? Aucune idée.Cela ajoute à la réponse ci-dessus à propos des noms d'URL de Django et de la répartition inverse des URL .
Les noms d'URL peuvent également être utilisés efficacement dans les modèles. Par exemple, pour un modèle d'URL donné:
vous pouvez avoir les éléments suivants dans les modèles:
la source
Étant donné que les "vues" Django doivent uniquement être des callables qui renvoient une HttpResponse, vous pouvez facilement créer des vues basées sur des classes comme celles de Ruby on Rails et d'autres frameworks.
Il existe plusieurs façons de créer des vues basées sur une classe, voici ma préférée:
Vous pouvez ajouter toutes sortes d'autres éléments, tels que le traitement et l'autorisation conditionnelle des demandes dans votre vue de base.
Une fois que vous avez configuré vos vues, votre urls.py ressemblera à ceci:
la source
Au lieu d'utiliser
render_to_response
pour lier votre contexte à un modèle et le rendre (ce que les documents Django montrent généralement), utilisez la vue génériquedirect_to_template
. Il fait la même choserender_to_response
mais ajoute automatiquement RequestContext au contexte du modèle, permettant implicitement d'utiliser des processeurs de contexte. Vous pouvez le faire manuellement en utilisantrender_to_response
, mais pourquoi s'embêter? C'est juste une autre étape à retenir et un autre LOC. En plus d'utiliser des processeurs de contexte, avoir RequestContext dans votre modèle vous permet de faire des choses comme:ce qui est très utile. En fait, +1 sur les vues génériques en général. Les documents Django les montrent principalement sous forme de raccourcis pour ne même pas avoir de fichier views.py pour des applications simples, mais vous pouvez également les utiliser dans vos propres fonctions d'affichage:
la source
render
méthode de raccourci de Django 1.3 ( docs.djangoproject.com/en/dev/topics/http/shortcuts/#render )Je n'ai pas assez de réputation pour répondre au commentaire en question, mais il est important de noter que si vous allez utiliser Jinja , il ne prend pas en charge le caractère «-» dans les noms de blocs de modèle, contrairement à Django. Cela m'a causé beaucoup de problèmes et perdu du temps à essayer de retrouver le message d'erreur très obscur qu'il a généré.
la source
L' application webdesign est très utile lorsque vous commencez à concevoir votre site Web. Une fois importé, vous pouvez l'ajouter pour générer un exemple de texte:
la source
django.db.models.get_model
vous permet de récupérer un modèle sans l'importer.James montre à quel point cela peut être pratique: "Astuces Django: Écrivez de meilleures balises de modèle - Itération 4" .
la source
Tout le monde sait qu'il existe un serveur de développement que vous pouvez exécuter avec "manage.py runserver", mais saviez-vous qu'il existe également une vue de développement pour servir des fichiers statiques (CSS / JS / IMG)?
Les nouveaux arrivants sont toujours perplexes car Django ne propose aucun moyen de servir des fichiers statiques. C'est parce que l'équipe de développement pense que c'est le travail d'un serveur Web réel.
Mais lors du développement, vous ne voudrez peut-être pas configurer Apache + mod_wisgi, c'est lourd. Ensuite, vous pouvez simplement ajouter ce qui suit à urls.py:
Votre CSS / JS / IMG sera disponible sur www.yoursite.com/site_media/.
Bien sûr, ne l'utilisez pas dans un environnement de production.
la source
J'ai appris celui-ci dans la documentation de l'application sorl-thumbnails . Vous pouvez utiliser le mot clé "as" dans les balises de modèle pour utiliser les résultats de l'appel ailleurs dans votre modèle.
Par exemple:
Ceci est mentionné en passant dans la documentation Django templatetag, mais en référence aux boucles uniquement. Ils n'appellent pas que vous pouvez également l'utiliser ailleurs (n'importe où?).
la source
django.views.generic.list_detail.object_list - Il fournit toutes les variables de logique et de modèle pour la pagination (une de ces tâches que j'ai écrites mille fois maintenant). L'emballage permet à toute logique dont vous avez besoin. Cette gemme m'a sauvé de nombreuses heures de débogage des erreurs ponctuelles dans mes pages "Résultats de la recherche" et rend le code d'affichage plus propre dans le processus.
la source
PyCharm IDE est un environnement agréable pour coder et surtout déboguer, avec un support intégré pour Django.
la source
Utilisez xml_models pour créer des modèles Django qui utilisent un backend d'API REST XML (au lieu d'un SQL). Cela est très utile, en particulier lors de la modélisation d'API tierces - vous obtenez la même syntaxe QuerySet que celle à laquelle vous êtes habitué. Vous pouvez l'installer à partir de PyPI.
XML à partir d'une API:
Et maintenant en python:
Il peut également gérer les relations et les collections. Nous l'utilisons tous les jours dans du code de production très utilisé, donc même s'il s'agit d'une version bêta, il est très utilisable. Il dispose également d'un bon ensemble de talons que vous pouvez utiliser dans vos tests.
(Avertissement: bien que je ne sois pas l'auteur de cette bibliothèque, je suis maintenant un committer, après avoir fait quelques commits mineurs)
la source
Utilisez les migrations de base de données. Utilisez Sud .
la source