Zainspirowany serią pytań „Ukryte funkcje ...” ciekawi mnie twoja ulubiona wskazówka Django lub mniej znane, ale przydatne funkcje, o których wiesz.
- Podaj tylko jedną wskazówkę na odpowiedź.
- Dodaj wymagania wersji Django, jeśli takie istnieją.
Zainspirowany serią pytań „Ukryte funkcje ...” ciekawi mnie twoja ulubiona wskazówka Django lub mniej znane, ale przydatne funkcje, o których wiesz.
Zacznę od napiwku od siebie :)
Użyj os.path.dirname () w settings.py, aby uniknąć zakodowanych nazw plików.
Nie wpisuj ścieżki kodu w pliku settings.py, jeśli chcesz uruchomić projekt w różnych lokalizacjach. Użyj następującego kodu w pliku settings.py, jeśli szablony i pliki statyczne znajdują się w katalogu projektu 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"),
)
Kredyty: Mam tę wskazówkę z screencastu „ Django From the Ground Up ”.
j = lambda filename: os.path.join(PROJECT_DIR, filename)
. Następnie wystarczy wpisaćj("static")
.wontfix
decyzji.Zainstaluj rozszerzenia Django Command i pygraphviz, a następnie wydaj następujące polecenie, aby uzyskać naprawdę ładną wizualizację modelu Django:
źródło
Zamiast tego użyj dekoratora django-irytującego .
render_to
render_to_response
Zredagowano, aby zwrócić uwagę, że zwracanie odpowiedzi HttpResponse (takiej jak przekierowanie) spowoduje zwarcie dekoratora i będzie działać zgodnie z oczekiwaniami.
źródło
Istnieje zestaw niestandardowych tagów, których używam we wszystkich szablonach mojej witryny. Szukając sposobu na automatyczne załadowanie (DRY, pamiętasz?), Znalazłem:
Jeśli umieścisz to w module, który jest domyślnie ładowany (na przykład głównym urlconf), będziesz mieć tagi i filtry z niestandardowego modułu tagów dostępne w dowolnym szablonie, bez użycia
{% load custom_tag_module %}
.Argumentem przekazywanym do
template.add_to_builtins()
może być dowolna ścieżka modułu; moduł niestandardowego znacznika nie musi znajdować się w określonej aplikacji. Może to być na przykład moduł w katalogu głównym projektu (np.'project.custom_tag_module'
).źródło
Virtualenv + Python = oszczędzanie życia, jeśli pracujesz nad wieloma projektami Django i istnieje możliwość, że nie wszystkie będą zależały od tej samej wersji Django / aplikacji.
źródło
virtualenv myNewEnv --no-site-packages
;. myNewEnv/bin/activate
;pip install django
; I to po prostu działa!Nie koduj na stałe swoich adresów URL!
Zamiast tego użyj nazw
reverse
adresów URL i funkcji, aby uzyskać sam adres URL.Podczas definiowania odwzorowań adresów URL podaj nazwy swoich adresów URL.
Upewnij się, że nazwa jest unikalna dla każdego adresu URL.
Zwykle mam spójny format „projektu-aplikacji-widoku”, np. „Cbx-forum-thread” dla widoku wątku.
AKTUALIZACJA (bezwstydnie kradnie dodatek Ajaza ):
Tej nazwy można używać w szablonach ze
url
znacznikiem .źródło
url
tagu ... Jego postawa jest taka, że adresy URL i tak nie powinny się zmieniać (jeśli chcesz być przyjazny dla twojego użytkownicy).{% url path.to.view.name arg1 arg2 %}
docs.djangoproject.com/en/dev/ref/templates/builtins/…reverse
ten sposóbenvironment.filters['url'] = django.core.urlresolvers.reverse
i możesz użyć go w swoich szablonach w następujący sposób:{{ 'view-name'|url(arg1, arg2)|e }}
(„e” jest potrzebne, aby uciec przed niektórymi znakami w celu włączenia do HTML)Użyj paska narzędzi debugowania django . Na przykład umożliwia przeglądanie wszystkich zapytań SQL wykonanych podczas renderowania widoku, a także przeglądanie stosu dla każdego z nich.
źródło
Nie pisz własnych stron logowania. Jeśli używasz django.contrib.auth.
Prawdziwy, brudny sekret polega na tym, że jeśli używasz również django.contrib.admin, a django.template.loaders.app_directories.load_template_source znajduje się w modułach ładujących szablony, możesz również pobrać szablony za darmo!
źródło
Procesory kontekstowe są niesamowite.
Załóżmy, że masz inny model użytkownika i chcesz go uwzględnić w każdej odpowiedzi. Zamiast tego:
Procesy kontekstowe umożliwiają przekazanie dowolnej zmiennej do szablonów. Zazwyczaj umieszczam mój w
'my_project/apps/core/context.py
:W swoim
settings.py
dodaj następujący wiersz do swojegoTEMPLATE_CONTEXT_PROCESSORS
Teraz za każdym razem, gdy jest wysyłane żądanie,
my_user
automatycznie dołącza klucz.Wygrywają również sygnały .
Kilka miesięcy temu napisałem o tym na blogu, więc zamierzam po prostu wyciąć i wkleić:
Po wyjęciu z pudełka Django daje kilka sygnałów, które są niezwykle przydatne. Masz możliwość robienia rzeczy przed i po zapisywaniu, inicjowaniu, usuwaniu, a nawet podczas przetwarzania żądania. Odejdźmy więc od koncepcji i pokażmy, jak są one używane. Powiedzmy, że mamy bloga
Więc w jakiś sposób chcesz powiadomić jedną z wielu usług pingowania blogów, o której napisaliśmy nowy post, odbudować pamięć podręczną najnowszych postów i opublikować tweeta. Cóż, z sygnałami możesz to wszystko zrobić bez konieczności dodawania jakichkolwiek metod do klasy Post.
Proszę bardzo, definiując tę funkcję i używając sygnału post_init, aby połączyć funkcję z modelem Post i wykonać ją po jej zapisaniu.
źródło
Kiedy zaczynałem, nie wiedziałem, że istnieje Paginator , upewnij się, że wiesz o jego istnieniu !!
źródło
Użyj IPython, aby wskoczyć do kodu na dowolnym poziomie i debugować przy użyciu mocy IPython. Po zainstalowaniu IPython umieść ten kod w miejscu, w którym chcesz debugować:
Następnie odśwież stronę, przejdź do okna runserver, a znajdziesz się w interaktywnym oknie IPython.
Mam fragment kodu skonfigurowany w TextMate, więc po prostu wpisuję ipshell i wciskam tab. Nie mogłem bez tego żyć.
źródło
ipdb
a następnie wpiszipdb.set_trace()
Uruchom programistyczny serwer SMTP, który po prostu wyśle wszystko, co zostanie do niego wysłane (jeśli nie chcesz tak naprawdę instalować SMTP na serwerze programisty).
wiersz poleceń:
źródło
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
..tak wydrukuje wiadomość e-mail namanage.py
wyjściu.Z dokumentacji django-admin :
Jeśli używasz powłoki Bash, rozważ zainstalowanie skryptu ukończenia bash Django, który znajduje się w
extras/django_bash_completion
dystrybucji Django. Umożliwia uzupełnianie tabulatorówdjango-admin.py
imanage.py
poleceń, dzięki czemu można na przykład ...django-admin.py
.sql
, a następnie [TAB], aby zobaczyć wszystkie dostępne opcje, których nazwy zaczynają sięsql
.źródło
./manage.py runserver_plus
Facilty która pochodzi z django_extensions jest naprawdę niesamowite.Tworzy ulepszoną stronę debugowania, która między innymi używa debugera Werkzeug do tworzenia interaktywnych konsol debugowania dla każdego punktu na stosie (patrz zrzut ekranu). Zapewnia również bardzo przydatną wygodną metodę debugowania
dump()
do wyświetlania informacji o obiekcie / ramce.Aby zainstalować, możesz użyć pip:
Następnie dodaj
'django_extensions'
doINSTALLED_APPS
krotkisettings.py
i uruchom serwer programistyczny z nowym rozszerzeniem:Zmieni to sposób debugowania.
źródło
Lubię używać debugera pdb Python do debugowania projektów Django.
To jest przydatny link do nauki korzystania z niego: http://www.ferg.org/papers/debugging_in_python.html
źródło
Podczas próby wymiany danych między Django a inną aplikacją
request.raw_post_data
jest dobrym przyjacielem. Użyj go do odbierania i przetwarzania danych, powiedzmy, danych XML.Dokumentacja: http://docs.djangoproject.com/en/dev/ref/request-response/
źródło
Użyj Jinja2 wraz z Django.
Jeśli uznasz, że język szablonów Django jest bardzo ograniczający (jak ja!), Nie musisz się z tym utknąć. Django jest elastyczny, a język szablonów jest luźno powiązany z resztą systemu, więc po prostu podłącz inny język szablonów i użyj go do renderowania odpowiedzi http!
Używam Jinja2 , jest to prawie jak ulepszona wersja języka szablonów django, używa tej samej składni i pozwala używać wyrażeń w instrukcjach if! nie trzeba tworzyć niestandardowych tagów if, takich jak
if_item_in_list
! możesz po prostu powiedzieć%{ if item in list %}
, lub{% if object.field < 10 %}
.Ale to nie wszystko; ma wiele innych funkcji ułatwiających tworzenie szablonów, których nie mogę przejść przez wszystkie tutaj.
źródło
Dodaj
assert False
kod widoku, aby zrzucić informacje debugowania.źródło
5 / 0
siebie. Dlaczego pięć? Brak pomysłu.To dodaje do powyższej odpowiedzi dotyczącej nazw adresów URL Django i odwrotnego wysyłania adresów URL .
Nazw adresów URL można również skutecznie używać w szablonach. Na przykład dla danego wzorca adresu URL:
możesz mieć następujące szablony:
źródło
Ponieważ „widoki” Django muszą być tylko wywoływalne, które zwracają odpowiedź HttpResponse, możesz łatwo tworzyć widoki oparte na klasach, takie jak te w Ruby on Rails i innych frameworkach.
Istnieje kilka sposobów tworzenia widoków opartych na klasach, oto moje ulubione:
W widoku podstawowym możesz dodać różnego rodzaju inne rzeczy, takie jak warunkowe przetwarzanie żądań i autoryzacja.
Po skonfigurowaniu widoków adres URL strony będzie wyglądał mniej więcej tak:
źródło
Zamiast używać
render_to_response
do wiązania kontekstu z szablonem i renderowania go (co zwykle pokazują dokumenty Django), użyj widoku ogólnegodirect_to_template
. Robi to samo, corender_to_response
robi, ale automatycznie dodaje RequestContext do kontekstu szablonu, domyślnie pozwalając na użycie procesorów kontekstowych. Możesz to zrobić ręcznie za pomocąrender_to_response
, ale po co? To tylko kolejny krok do zapamiętania i kolejny LOC. Oprócz korzystania z procesorów kontekstowych posiadanie RequestContext w szablonie pozwala na wykonywanie następujących czynności:co jest bardzo przydatne. W rzeczywistości +1 ogólnie za ogólne widoki. Dokumenty Django pokazują je głównie jako skróty, nawet w przypadku braku pliku views.py dla prostych aplikacji, ale można ich również używać w ramach własnych funkcji widoku:
źródło
render
metody skrótu z Django 1.3 ( docs.djangoproject.com/en/dev/topics/http/shortcuts/#render )Nie mam wystarczającej reputacji, aby odpowiedzieć na dany komentarz, ale ważne jest, aby pamiętać, że jeśli zamierzasz użyć Jinja , NIE obsługuje on znaku „-” w nazwach bloków szablonów, podczas gdy Django to robi. Spowodowało to wiele problemów i zmarnowałem czas, próbując wyśledzić bardzo niejasny komunikat o błędzie, który wygenerował.
źródło
Aplikacja webdesign jest bardzo przydatna na początku projektowania witryny. Po zaimportowaniu możesz dodać to, aby wygenerować przykładowy tekst:
źródło
django.db.models.get_model
pozwala odzyskać model bez importowania go.James pokazuje, jak może być przydatny: „Wskazówki Django: Napisz lepsze tagi szablonów - Iteracja 4” .
źródło
Wszyscy wiedzą, że istnieje serwer programistyczny, który można uruchomić za pomocą „manage.py runserver”, ale czy wiesz, że istnieje również widok programistyczny do obsługi plików statycznych (CSS / JS / IMG)?
Nowicjusze są zawsze zdziwieni, ponieważ Django nie oferuje żadnego sposobu obsługi plików statycznych. Jest tak, ponieważ zespół deweloperów uważa, że jest to praca dla prawdziwego serwera WWW.
Ale podczas programowania możesz nie chcieć konfigurować Apache + mod_wisgi, jest ciężki. Następnie możesz po prostu dodać do urls.py:
Twój CSS / JS / IMG będzie dostępny na stronie www.yoursite.com/site_media/.
Oczywiście nie używaj go w środowisku produkcyjnym.
źródło
Nauczyłem się tego z dokumentacji aplikacji sorl-thumbnails . Możesz użyć słowa kluczowego „as” w tagach szablonów, aby użyć wyników połączenia w innym miejscu w szablonie.
Na przykład:
Zostało to wspomniane w dokumentacji szablonów Django, ale tylko w odniesieniu do pętli. Nie wzywają, że możesz użyć tego również w innym miejscu (gdziekolwiek?).
źródło
django.views.generic.list_detail.object_list - Zapewnia wszystkie zmienne logiczne i szablony do paginacji (jedna z tych kryminałów, które napisałem tysiące razy). Owijanie pozwala na dowolną logikę, której potrzebujesz. Ten klejnot zaoszczędził mi wiele godzin debugowania błędów po kolei na moich stronach „Wyniki wyszukiwania” i sprawia, że kod widoku jest czystszy.
źródło
PyCharm IDE to ładne środowisko do kodowania, a zwłaszcza debugowania, z wbudowaną obsługą Django.
źródło
Użyj xml_models, aby utworzyć modele Django, które używają backendu API REST XML (zamiast SQL). Jest to bardzo przydatne zwłaszcza podczas modelowania interfejsów API stron trzecich - otrzymujesz tę samą składnię QuerySet, do której jesteś przyzwyczajony. Możesz zainstalować go z PyPI.
XML z API:
A teraz w python:
Może także obsługiwać relacje i kolekcje. Używamy go codziennie w mocno używanym kodzie produkcyjnym, więc nawet jeśli jest to wersja beta, jest bardzo użyteczna. Ma również dobry zestaw kodów pośredniczących, które można wykorzystać w testach.
(Oświadczenie: chociaż nie jestem autorem tej biblioteki, teraz jestem komisarzem, popełniłem kilka drobnych zmian)
źródło
Użyj migracji bazy danych. Użyj południa .
źródło