Ulubione porady i funkcje Django?


308

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ą.

Odpowiedzi:


221

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 ”.


75
Nie należy głosować za osobami, które odpowiadają na ich własne pytania. Jest zachęcany, nawet jeśli jest z góry ustalony.
Paolo Bergantino,

19
To jest tak dobry pomysł, że wciąż trudno mi zrozumieć, dlaczego nie jest to domyślne. Ilu ludzi testuje i wdraża na tym samym komputerze?
SingleNegationElimination

19
To łagodzi wy od zawsze wpisać os.path.join (), która staje się irytujące dość szybko: j = lambda filename: os.path.join(PROJECT_DIR, filename). Następnie wystarczy wpisać j("static").
wr.

13
Jeśli korzystasz z systemu Windows, zamień ukośniki odwrotne: os.path.join (PROJECT_DIR, „templates”). Replace ('\\', '/')
Peter Mortensen

7
Jeśli naprawdę chcesz to naprawić w Django, zostaw komentarz na code.djangoproject.com/ticket/694, prosząc deweloperów o ponowne rozważenie wontfixdecyzji.
sorin

128

Zainstaluj rozszerzenia Django Command i pygraphviz, a następnie wydaj następujące polecenie, aby uzyskać naprawdę ładną wizualizację modelu Django:

./manage.py graph_models -a -g -o my_project.png

Fajnie, nie udało się zmusić pirgraphviz do prawidłowej instalacji w systemie Windows, ale nadal można ukryć z pliku kropki za pomocą graphviz.
monkut

Uwielbiam dzielić schematy modeli z tym zdecydowanie +1
BozoJoe

Czy jest do tego opcja SVG?
Keyo

obraz wyjściowy wydaje się być teraz zniszczony
Brian Wigginton,

119

Zamiast tego użyj dekoratora django-irytującego .render_torender_to_response

@render_to('template.html')
def foo(request):
    bars = Bar.objects.all()
    if request.user.is_authenticated():
        return HttpResponseRedirect("/some/url/")
    else:
        return {'bars': bars}

# equals to
def foo(request):
    bars = Bar.objects.all()
    if request.user.is_authenticated():
        return HttpResponseRedirect("/some/url/")
    else:
        return render_to_response('template.html',
                              {'bars': bars},
                              context_instance=RequestContext(request))

Zredagowano, aby zwrócić uwagę, że zwracanie odpowiedzi HttpResponse (takiej jak przekierowanie) spowoduje zwarcie dekoratora i będzie działać zgodnie z oczekiwaniami.


4
@becomingGuru - dzieje się to automatycznie.
Dominic Rodger

15
To dobrze, chyba że zwracasz niektóre HttpResponseRedirect () i niektóre render_to_response (). Wtedy przekierowania nie udają się.
Matthew Schinckel,

17
Nie podoba mi się to „Jawne jest lepsze niż niejawne”. Dekorator nie mówi, kiedy dokładnie wyrenderuje to.
Tamás Szelei

2
@Matthew Schinckel tak naprawdę nie psuje przekierowań - jeśli zwrócisz obiekt HttpResponse, po prostu przekaże go bez modyfikacji
Jiaaro

20
Wierzę, że to podejście jest teraz zbędne od wersji Django 1.3, patrz django.shortcuts.render () docs.djangoproject.com/en/dev/topics/http/shortcuts/#render
Dolph

101

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:

from django import template
template.add_to_builtins('project.app.templatetags.custom_tag_module')

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').


@ Steef, właśnie zaoszczędziłeś mi mnóstwo czasu / ból serca / bajtów, dzięki.
orokusaki,

Bardzo miłe. Dzięki. Również repozytorium niestandardowych tagów byłoby wspaniale udostępniać, nie sądzisz?
Leandro Ardissone

To świetnie, dopóki ktoś inny nie będzie musiał utrzymywać twojego kodu. Pomyśl: „zasada najmniejszej magii”
Rich

96

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.


15
To jest TYLKO sposób na rzut!
postfuturist

3
Czy możesz dodać linki do samouczków dla virtualenv z django?
BozoJoe

2
@BozoJoe: Czy to w terminalu: virtualenv myNewEnv --no-site-packages; . myNewEnv/bin/activate; pip install django; I to po prostu działa!
SingleNegationElimination

87

Nie koduj na stałe swoich adresów URL!

Zamiast tego użyj nazwreverse adresów URL i funkcji, aby uzyskać sam adres URL.

Podczas definiowania odwzorowań adresów URL podaj nazwy swoich adresów URL.

urlpatterns += ('project.application.views'
   url( r'^something/$', 'view_function', name="url-name" ),
   ....
)

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 urlznacznikiem .


1
Zgadzam się w 100% w tej sprawie. Zacząłem od korzystania z zakodowanych adresów URL i ugryzło mnie to w projekt, gdy nieco zmieniłem format adresu URL, aby uwzględnić pewne zmiany. Poświęciłem czas, aby wrócić i przejrzeć wszystko i zastąpić zakodowane adresy URL. Moją jedyną dużą skargą jest to, że błędy tagu URL zabijają całą stronę, podczas gdy zakodowane na stałe przekreśla jedynie pojedynczy link.
ricree

21
To nie powinna być ukryta funkcja, to najlepsza praktyka i jedyny sposób na latanie.
Skylar Saveland,

1
@skyl Nie jest to „jedyny sposób na latanie”. Byłem na sprincie deweloperów Django, a Adrian Holovaty (jeden z twórców Django) powiedział, że nawet nie używa urltagu ... Jego postawa jest taka, że ​​adresy URL i tak nie powinny się zmieniać (jeśli chcesz być przyjazny dla twojego użytkownicy).
TM.

możesz użyć tego również w szablonach, jak w {% url path.to.view.name arg1 arg2 %} docs.djangoproject.com/en/dev/ref/templates/builtins/…
SingleNegationElimination

Jeśli używasz jinja2, po prostu dodaj w reverseten sposób environment.filters['url'] = django.core.urlresolvers.reversei 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)
SingleNegationElimination


79

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!

# somewhere in urls.py
urlpatterns += patterns('django.contrib.auth',
    (r'^accounts/login/$','views.login', {'template_name': 'admin/login.html'}),
    (r'^accounts/logout/$','views.logout'),
)

1
Fajne! Nie wiedziałem, że możemy ponownie użyć strony logowania administratora. Dzięki!
Joshua Partogi

66

Procesory kontekstowe są niesamowite.

Załóżmy, że masz inny model użytkownika i chcesz go uwzględnić w każdej odpowiedzi. Zamiast tego:

def myview(request, arg, arg2=None, template='my/template.html'):
    ''' My view... '''
    response = dict()
    myuser = MyUser.objects.get(user=request.user)
    response['my_user'] = myuser
    ...
    return render_to_response(template,
                              response,
                              context_instance=RequestContext(request))

Procesy kontekstowe umożliwiają przekazanie dowolnej zmiennej do szablonów. Zazwyczaj umieszczam mój w 'my_project/apps/core/context.py:

def my_context(request):
    try:
        return dict(my_user=MyUser.objects.get(user=request.user))
    except ObjectNotFound:
        return dict(my_user='')

W swoim settings.pydodaj następujący wiersz do swojegoTEMPLATE_CONTEXT_PROCESSORS

TEMPLATE_CONTEXT_PROCESSORS = (
    'my_project.apps.core.context.my_context',
    ...
)

Teraz za każdym razem, gdy jest wysyłane żądanie, my_userautomatycznie 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

from django.utils.translation import ugettext_lazy as _
class Post(models.Model):
    title = models.CharField(_('title'), max_length=255)
    body = models.TextField(_('body'))
    created = models.DateTimeField(auto_now_add=True)

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.

import twitter

from django.core.cache import cache
from django.db.models.signals import post_save
from django.conf import settings

def posted_blog(sender, created=None, instance=None, **kwargs):
    ''' Listens for a blog post to save and alerts some services. '''
    if (created and instance is not None):
        tweet = 'New blog post! %s' instance.title
        t = twitter.PostUpdate(settings.TWITTER_USER,
                               settings.TWITTER_PASSWD,
                               tweet)
        cache.set(instance.cache_key, instance, 60*5)
       # send pingbacks
       # ...
       # whatever else
    else:
        cache.delete(instance.cache_key)
post_save.connect(posted_blog, sender=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.


4
Sygnały Django są dla mnie obecnie niezbędną funkcją przy porównywaniu frameworków internetowych. Pisząc luźno powiązane forum, powiedzmy, które może nasłuchiwać, powiedzmy, aktualizacji z modułu „podpisu”, ale tak naprawdę nie wymaga tego modułu do działania, i które może również współpracować z kompatybilnymi modułami implementującymi tę samą funkcję, jest świetne. Nie wiem, dlaczego sygnały nie są bardziej znane i popularne.
Lee B

Sygnały są bardzo ważne, aby uniknąć ścisłego łączenia i bałaganu w kodzie, jeśli w naszym projekcie korzystamy z aplikacji wielokrotnego użytku. Dałeś doskonały przykład luźnego łączenia aplikacji django, +1 za to.
Łukasz Korzybski

Czy wiesz, czy sygnały są asynchroniczne?
Kedare

„Powiedz, że masz inny model użytkownika i chcesz go uwzględnić w każdej odpowiedzi”. - Umieść użytkownika w sesji . To oszczędza trafienie w bazę danych dla każdego żądania.
jammon

Połączenia sygnałów są synchroniczne. Moim zdaniem jakiś asynchroniczny mechanizm zadania jest bardziej odpowiedni, powiedzmy, do publikowania na Twitterze / Facebooku / itp. (Tj. - rabbitmq), więc użytkownicy naszej witryny nie zawieszają się na żądanie.
gorsky,


46

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ć:

from IPython.Shell import IPShellEmbed; IPShellEmbed()()

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ć.


22
Lepiej zainstaluj, ipdba następnie wpiszipdb.set_trace()
Tomasz Zieliński,

Lub użyj debugera Eclipse / PyDev. :-)
jMyles

3
import ipdb; ipdb.set_trace () FTW!
Hassek

43

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ń:

python -m smtpd -n -c DebuggingServer localhost:1025

12
w tym samym celu możesz używać backendów konsoli i plików e-mail w django 1.2
Dmitrij Szewczenko,

wybitny! idealny do rejestracji! +1
BozoJoe

3
Alternatywnie w Django 1.2 z ustawieniami: EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' ..tak wydrukuje wiadomość e-mail na manage.pywyjściu.
vdboor

41

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_completiondystrybucji Django. Umożliwia uzupełnianie tabulatorów django-admin.pyi manage.pypoleceń, dzięki czemu można na przykład ...

  • Wpisz django-admin.py.
  • Naciśnij [TAB], aby zobaczyć wszystkie dostępne opcje.
  • Wpisz sql, a następnie [TAB], aby zobaczyć wszystkie dostępne opcje, których nazwy zaczynają się sql.

1
Jest to bardziej przydatne niż się spodziewałem. Dzięki!
Jeeyoung Kim

Jest to domyślnie włączone przynajmniej w nowszych Ubuntu. :-) Byłem zaskoczony, gdy po raz pierwszy pojawił się znikąd.
odinho

40

./manage.py runserver_plusFacilty 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.

wprowadź opis zdjęcia tutaj

Aby zainstalować, możesz użyć pip:

pip install django_extensions
pip install Werkzeug

Następnie dodaj 'django_extensions'do INSTALLED_APPSkrotki settings.pyi uruchom serwer programistyczny z nowym rozszerzeniem:

./manage.py runserver_plus

Zmieni to sposób debugowania.


37

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


13
To jest darem niebios. Aby podać trochę więcej informacji, po prostu dodaj: „import pdb; pdb.set_trace ()” w dowolnym wierszu kodu. Odśwież stronę. Zawiesi się. Teraz przejdź do okna terminala, na którym działa serwer programistyczny. Powinna być teraz interaktywną powłoką, w której można uzyskać dostęp do wszystkich zmiennych w tym miejscu w kodzie, w którym wklejono kod debugowania.
priestc


36

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.


Używam i lubię też Jinja2, ale odkryłem, że istnieją pewne sprzężenia z aplikacjami „contrib”. W szczególności narzędzie administracyjne jest dość mocno powiązane z szablonami Django. Musiałem także odtworzyć dekoratory logowania w contrib.auth, aby być przyjaznym dla Jinja2, ale niezbyt trudnym.
Joe Holloway,

24
Nie zamieniaj systemu szablonów na jinja2, po prostu „dodaj” go, nie usuwaj szablonów django. Użyj Jinja2 do własnych widoków i pozwól interfejsowi administratora nadal używać języka szablonów django.
hasen

4
Zgadzam się z tym szczerze. Ograniczona składnia Django jest tolerowana przez większość czasu, ale kiedy dochodzisz do momentu tworzenia niestandardowych tagów i dowiadujesz się, jak trudne to jest naprawdę, Jinja2 to powiew świeżości
SingleNegationElimination

Ponadto, jeśli chcesz wykonać jakiekolwiek metaprogramowanie na źródle szablonów, Jinja2 jest znacznie przyjemniejszy, ponieważ możesz bezpośrednio uzyskać dostęp do AST przeanalizowanych szablonów. Spacer po AST sprawia, że ​​zadania, takie jak ustalenie, które szablony rozszerzają szablon podstawowy lub wyszczególnienie niezwiązanych zmiennych w bloku źródłowym szablonu, są prawie banalnie łatwe.
rcoder,

5
Na szczęście w Django 1.2 tag IF jest
znacznie

35

Dodaj assert Falsekod widoku, aby zrzucić informacje debugowania.


4
Myślę, że twierdzenie Fałsz jest bardziej intuicyjne = D
Jiaaro

13
jeśli prowadzisz swój projekt na serwerze deweloperskim django, użyj modułu pdb Pythona. Jest to o wiele potężniejszy sposób debugowania: import pdb; pdb.stack_trace ()
mazelife

pdb jest bardzo przydatny, prawdopodobnie upłynie limit czasu połączeń, chyba że jesteś bardzo szybki w debugowaniu.
Stephen Paulger

4
Zawsze używam 5 / 0siebie. Dlaczego pięć? Brak pomysłu.
JasonSmith,

@StephenPaulger naprawdę? Wygląda na to, że moja przeglądarka (firefox / w firebug) czeka kilka minut na odpowiedź podczas debugowania.
TM.

34

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:

url(r'(?P<project_id>\d+)/team/$', 'project_team', name='project_team')

możesz mieć następujące szablony:

<a href="{% url project_team project.id %}">Team</a>

27

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:

from django import http

class RestView(object):
    methods = ('GET', 'HEAD')

    @classmethod
    def dispatch(cls, request, *args, **kwargs):
        resource = cls()
        if request.method.lower() not in (method.lower() for method in resource.methods):
            return http.HttpResponseNotAllowed(resource.methods)
        try:
            method = getattr(resource, request.method.lower())
        except AttributeError:
            raise Exception("View method `%s` does not exist." % request.method.lower())
        if not callable(method):
            raise Exception("View method `%s` is not callable." % request.method.lower())
        return method(request, *args, **kwargs)

    def get(self, request, *args, **kwargs):
        return http.HttpResponse()

    def head(self, request, *args, **kwargs):
        response = self.get(request, *args, **kwargs)
        response.content = ''
        return response

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:

from django.conf.urls.defaults import *
from views import MyRestView

urlpatterns = patterns('',
    (r'^restview/', MyRestView.dispatch),
)

2
FWIW, autorzy django faktycznie używają widoków klasowych w kilku miejscach, np. Contrib.formtools: code.djangoproject.com/browser/django/trunk/django/contrib/…
mazelife

3
Jeśli dodasz metodę wywołania , możesz utworzyć klasę o nazwie RestfulResource, a następnie poprowadzić adres urls.py do instancji.
Stephen Paulger,

1
Nowe widoki ogólne (Django 1.3?) Są oparte na klasach.
gorsky,

21

Zamiast używać render_to_responsedo wiązania kontekstu z szablonem i renderowania go (co zwykle pokazują dokumenty Django), użyj widoku ogólnego direct_to_template. Robi to samo, co render_to_responserobi, 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:

<a href="{{MEDIA_URL}}images/frog.jpg">A frog</a> 

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:

from django.views.generic import simple

def article_detail(request, slug=None):
    article = get_object_or_404(Article, slug=slug)
    return simple.direct_to_template(request, 
        template="articles/article_detail.html",
        extra_context={'article': article}
    )

Zaoszczędź jeszcze więcej LOC, używając dekoratora @render_to dostępnego w irytującym django. bitbucket.org/offline/django-annoying
pithyless

6
.. lub użyj nowej rendermetody skrótu z Django 1.3 ( docs.djangoproject.com/en/dev/topics/http/shortcuts/#render )
gorsky,

20

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ł.


Jedna uwaga, która może, ale nie musi mieć zastosowania, do „niejasnych komunikatów o błędach z jinja”. Upewnij się, że ustawiłeś TEMPLATE_DEBUG = False w settings.py. Z jakiegoś powodu da to znaczące błędy z szablonów Jinja.
Carl G

19

Aplikacja webdesign jest bardzo przydatna na początku projektowania witryny. Po zaimportowaniu możesz dodać to, aby wygenerować przykładowy tekst:

{% load webdesign %}
{% lorem 5 p %}

4
Do Twojej wiadomości, dla każdego, kto używa Jinja2 zamiast szablonów Django, możesz: {{lipsum (5)}}
Joe Holloway


19

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:

(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
        {'document_root': '/path/to/media'}),

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.


6
Używam tego w trybie deweloperskim, i aby upewnić się, że nie zapomnę wyłączyć tego w produkcji, zawijam tę regułę URL tylko w warunku DEBUG.
sghael

18

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:

{% url image-processor uid as img_src %}
<img src="{% thumbnail img_src 100x100 %}"/>

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?).


7
To, czy słowo kluczowe „as” może być użyte z tagiem szablonu, zależy od tego konkretnego tagu. Nie jest definiowany przez sam django, ale przez pojedyncze znaczniki, w zależności od ich znaczenia. Spójrz we wspomnianym tagu url, aby zobaczyć, jak używane jest „as”: code.djangoproject.com/browser/django/trunk/django/template/…
vikingosegundo

16

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.


1
Nową wersję rozdziału książki na temat widoków ogólnych można znaleźć na stronie djangobook.com/en/2.0/chapter11 . Ten w komentarzu odnosi się do wersji Django sprzed 1.0 (książka Django 1.0)
Esteban Küber


14

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:

<profile id=4>
    <email>joe@example.com</email>
    <first_name>Joe</first_name>
    <last_name>Example</last_name>
    <date_of_birth>1975-05-15</date_of_birth>
</profile>

A teraz w python:

class Profile(xml_models.Model):
    user_id = xml_models.IntField(xpath='/profile/@id')
    email = xml_models.CharField(xpath='/profile/email')
    first = xml_models.CharField(xpath='/profile/first_name')
    last = xml_models.CharField(xpath='/profile/last_name')
    birthday = xml_models.DateField(xpath='/profile/date_of_birth')

    finders = {
        (user_id,):  settings.API_URL +'/api/v1/profile/userid/%s',
        (email,):  settings.API_URL +'/api/v1/profile/email/%s',
    }

profile = Profile.objects.get(user_id=4)
print profile.email
# would print 'joe@example.com'

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)


ciekawy projekt, tak trzymaj!
Sergey Golovchenko

Dzięki, to całkiem przydatne :-)
godswearhats

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.