Favori Django İpuçları ve Özellikleri?


308

'Gizli özellikler ...' soru serisinden esinlenerek, en sevdiğiniz Django ipuçlarını veya daha az bilinen ama yararlı olan özellikleri duymak isterim.

  • Lütfen cevap başına yalnızca bir ipucu ekleyin.
  • Varsa Django sürüm gereksinimlerini ekleyin.

Yanıtlar:


221

Sadece kendimden bir ipucu ile başlayacağım :)

Sabit kodlu dizin adlarından kaçınmak için settings.py dosyasında os.path.dirname () öğesini kullanın.

Projenizi farklı konumlarda çalıştırmak istiyorsanız, yollarınız ayarlarınızda sabit kod kullanmayın. Şablonlarınız ve statik dosyalarınız Django proje dizininde bulunuyorsa settings.py dosyasında aşağıdaki kodu kullanın:

# 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"),
)

Kredi: Bu ipucu ' Django From the Up Up ' ekran görüntüsünü aldım .


75
Kendi sorularını cevaplayan insanları küçümsememelisin. Önceden belirlenmiş olsa bile teşvik edilir.
Paolo Bergantino

19
Bu o kadar iyi bir fikir ki, neden varsayılan olmadığını anlamakta hala zorlanıyorum. Aynı makinede kaç kişi test ediyor ve dağıtıyor?
SingleNegationElimination

19
Hep gelen bu hafifletir size () can sıkıcı oldukça hızlı aldığı os.path.join yazın: j = lambda filename: os.path.join(PROJECT_DIR, filename). O zaman yazmanız yeterlidir j("static").
wr.

13
Windows'taysanız ters eğik çizgileri değiştirin: os.path.join (PROJECT_DIR, "şablonlar"). Değiştirin ('\\', '/')
Peter Mortensen

7
Django'da bunu düzeltmek istiyorsanız , code.djangoproject.com/ticket/694 adresine bir yorum bırakın ve çekirdek geliştiricilerin wontfixkararı yeniden değerlendirmesini isteyin .
sorin

128

Yükleme Django Komuta Uzantıları ve pygraphviz gerçekten güzel görünümlü Django modeli görselleştirme almak için aşağıdaki komutu sonra ve:

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

Güzel, pygraphviz pencerelere doğru şekilde yüklenemedi, ancak yine de graphviz kullanarak nokta dosyasından gizlenebilir.
monkut

Model diyagramlarını kesinlikle bir +1 ile paylaşmayı seviyorum
BozoJoe

Bunun için bir svg seçeneği var mı?
Keyo

çıktı görüntüsü şimdi yakalanmış gibi görünüyor
Brian Wigginton

119

Kullanım django-can sıkıcı en render_to yerine dekoratörü render_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))

Bir HttpResponse döndürmenin (örneğin bir yönlendirme gibi) dekoratörü kısa devre yapacağını ve beklediğiniz gibi çalışacağını göstermek için düzenlenmiştir.


4
@becomingGuru - otomatik olarak gerçekleşir.
Dominic Rodger

15
Bazı HttpResponseRedirect () s ve bazı render_to_response () s döndürmüyorsanız, bu iyi. Sonra yönlendirmeler başarısız olur.
Matthew Schinckel

17
Sevmiyorum. "Açık, örtük olmaktan iyidir". Dekoratör ne zaman render_to yapacağını söylemiyor.
Tamás Szelei

2
@Matthew Schinckel aslında yönlendirmeleri bozmuyor - bir HttpResponse nesnesini döndürürseniz, onu değiştirmeden sadece geçiyor
Jiaaro

20
Bu yaklaşımın Django 1.3'ten itibaren artık gereksiz olduğuna inanıyorum, bkz. Django.shortcuts.render () docs.djangoproject.com/en/dev/topics/http/shortcuts/#render
Dolph

101

Sitemin tüm şablonlarında kullandığım bir dizi özel etiket var. Otomatik yüklemenin bir yolunu arıyorsunuz (KURU, hatırlıyor musunuz?), Aşağıdakileri buldum:

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

Bunu varsayılan olarak yüklenmiş bir modüle (örneğin, ana urlconf'unuz) koyarsanız, kullanmadan, herhangi bir şablonda özel etiket modülünüzdeki etiketleri ve filtreleri kullanabilirsiniz {% load custom_tag_module %}.

Aktarılan argüman template.add_to_builtins()herhangi bir modül yolu olabilir; özel etiket modülünüzün belirli bir uygulamada yaşaması gerekmez. Örneğin, projenizin kök dizinindeki bir modül de olabilir (örn. 'project.custom_tag_module').


@Steef, bana biraz zaman kazandın / gönül yarası / bayt, teşekkürler.
orokusaki

Gerçekten hoş. Teşekkürler. Ayrıca özel etiketlerin bir havuzu, şeyleri paylaşmak harika olurdu, değil mi?
Leandro Ardissone

Başka birinin kodunuzu koruması gerekene kadar bu harika bir şey. Düşünün: "En az büyü prensibi"
Zengin

96

Virtualenv + Python = birden fazla Django projesi üzerinde çalışıyorsanız ve hepsinin Django / bir uygulamanın aynı sürümüne bağlı olmaması ihtimali vardır.


15
Bu sadece yuvarlanma yolu!
postfuturist

3
Django ile virtualenv için bazı öğretici bağlantılar ekleyebilir misiniz?
BozoJoe

2
@BozoJoe: Bunu terminalinizde yapın virtualenv myNewEnv --no-site-packages:; . myNewEnv/bin/activate; pip install django; Ve sadece işe yarıyor!
SingleNegationElimination

87

URL'lerinizi kodlamayın!

Kullan url isimleri yerine ve reversefonksiyon URL kendisi alır.

URL eşlemelerinizi tanımladığınızda, URL'lerinize ad verin.

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

Adın URL başına benzersiz olduğundan emin olun.

Genellikle bir iş parçacığı görünümü için tutarlı bir biçimi "proje-appplication-görünümü", örneğin "cbx-forum-thread" var.

GÜNCELLEME (utanmazca ayaz ilavesi çalıyor ):

Bu ad urletiketli şablonlarda kullanılabilir .


1
Bu konuda% 100 katılıyorum. Sabit kodlu URL'leri kullanmaya başladım ve bazı değişiklikleri karşılamak için URL biçimini biraz değiştirdiğimde bir projede beni ısırdı. Geri dönüp her şeyi araştırıp sabit kodlu URL'leri değiştirmek için zaman ayırdım. Benim tek büyük şikayet sabit kod sadece bireysel bağlantı berbat ederken url etiketi hataları tüm sayfayı öldürmek olduğunu.
ricree

21
Bu gizli bir özellik olmamalı, bu en iyi uygulama ve uçmanın tek yoludur.
Skylar Saveland

1
@skyl Bu "uçmanın tek yolu" değildir. Django dev sprint'indeydim ve Adrian Holovaty (Django'nun yaratıcılarından biri) urletiketi bile kullanmadığını söyledi ... Duruşu , URL'lerin yine de değişmemesi gerektiğidir ( kullanıcılar).
TM.


Jinja2 kullanıyorsanız, sadece reversebu şekilde ekleyin environment.filters['url'] = django.core.urlresolvers.reverseve şablonlarınızda şöyle kullanabilirsiniz: {{ 'view-name'|url(arg1, arg2)|e }}(HTML'ye dahil edilmek için bazı karakterlerden kaçmak için "e" gerekir)
SingleNegationElimination


79

Kendi giriş sayfalarınızı yazma. Django.contrib.auth kullanıyorsanız.

Gerçek, kirli sır, django.contrib.admin'i kullanıyorsanız ve django.template.loaders.app_directories.load_template_source şablon yükleyicilerinizde ise, şablonlarınızı da ücretsiz alabilirsiniz!

# 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
Güzel! Yönetici giriş sayfasını tekrar kullanabileceğimizi bilmiyordum. Teşekkürler!
Joshua Partogi

66

Bağlam işlemcileri harika.

Farklı bir kullanıcı modeliniz olduğunu ve bunu her yanıta dahil etmek istediğinizi varsayalım. Bunu yapmak yerine:

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

Bağlam işlemleri, şablonlarınıza herhangi bir değişkeni iletme olanağı sağlar. Genellikle benimkini koydum '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='')

Senin içinde settings.pyeklenti için çizgi izleyen seninTEMPLATE_CONTEXT_PROCESSORS

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

Şimdi her istek yapıldığında my_useranahtar otomatik olarak içeriyor .

Ayrıca sinyaller kazanır.

Birkaç ay önce bunun hakkında bir blog yazısı yazdım, bu yüzden sadece kesip yapıştıracağım:

Kutudan çıkar çıkmaz Django size inanılmaz derecede faydalı birkaç sinyal verir. Kaydetme, başlatma, silme ve hatta bir istek işlenirken bile ön ve son işlem yapma olanağına sahipsiniz. Şimdi kavramlardan uzaklaşalım ve bunların nasıl kullanıldığını gösterelim. Diyelim ki bir blogumuz var

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)

Bir şekilde blog ping hizmetlerinden birine yeni bir gönderi yaptığımızı bildirmek, en son yayınların önbelleğini yeniden oluşturmak ve tweet atmak istiyoruz. Peki sinyaller ile tüm bunları Post sınıfına herhangi bir yöntem eklemek zorunda kalmadan yapabilirsiniz.

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)

İşte, bu işlevi tanımlayarak ve işlevi Post modeline bağlamak ve kaydedildikten sonra yürütmek için post_init sinyalini kullanarak gidiyoruz.


4
Django'nun Sinyalleri, bu günlerde web çerçevelerini karşılaştırırken benim için olmazsa olmaz bir özellik. Diyelim ki, bir "imza" modülünden güncellemeleri dinleyebilen, ama aslında bu modülün çalışmasını gerektirmeyen ve aynı özelliği uygulayan uyumlu modüllerle çalışabilen gevşek bağlı bir forum yazmak harika. Sinyallerin neden daha iyi bilinmediğini ve popüler olmadığını bilmiyorum.
Lee B

Projemizde bazı yeniden kullanılabilir uygulamalar kullanırsak, genel olarak sıkı bağlantı ve kod karışıklığını önlemek için sinyaller çok önemlidir. Django uygulamalarının gevşek bağlanması için mükemmel bir örnek sağladınız, bunun için +1.
Lukasz Korzybski

Sinyallerin zaman uyumsuz olup olmadığını biliyor musunuz?
Kedare

"Farklı bir kullanıcı modeliniz olduğunu ve bunu her yanıta eklemek istediğinizi varsayalım." - Kullanıcıyı oturuma dahil edin . Bu, her istek için size bir veritabanı isabeti kazandırır.
jammon

Sinyallerin çağrıları senkronize. Bence, bir tür asenkron iş mekanizması, örneğin Twitter / Facebook / etc (yani - rabbitmq) 'da yayınlamak için daha uygundur, bu nedenle web sitesi dışındaki kullanıcılar istek üzerine askıda kalmazlar.
gorsky

58

Başlarken, bir Sayfacı olduğunu bilmiyordum, varlığını bildiğinizden emin olun !!


2
: Benim için aynısı! Sayfalandırma için günler geçirdim!
vikingosegundo

46

Kullanım ipython ipython gücünü kullanarak herhangi bir düzeyde ve hata ayıklama adresinden koduna atlamak için. IPython'u yükledikten sonra bu kodu hata ayıklamak istediğiniz yere koyun:

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

Ardından, sayfayı yenileyin, runserver pencerenize gidin ve etkileşimli bir IPython penceresinde olacaksınız.

Ben sadece ipshell yazın ve sekme vurmak TextMate ayarlanmış bir snippet var. Onsuz yaşayamam.


22
Daha iyi kurulum ipdbve sonra sadece yazınipdb.set_trace()
Tomasz Zieliński

Veya Eclipse / PyDev'in hata ayıklayıcısını kullanın. :-)
jMyles

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

43

Sadece ne gönderilirse gönderilecek bir geliştirme SMTP sunucusu çalıştırın (aslında geliştirme sunucunuza SMTP kurmak istemiyorsanız).

Komut satırı:

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

12
aynı amaç için django 1.2'de konsol ve e-posta arka uçlarını kullanabilirsiniz
Dmitry Shevchenko

Muhteşem! kayıt için mükemmel! +1
BozoJoe

3
Alternatif Django 1.2 ayarları ile .. EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' ..bu manage.pyçıktıya e-posta yazdıracak .
vdboor

41

Gönderen django-admin belgelerinde :

Bash kabuğunu kullanıyorsanız extras/django_bash_completion, Django dağıtımında yaşayan Django bash tamamlama komut dosyasını yüklemeyi düşünün . Sekmelerin tamamlanmasını django-admin.pyve manage.pykomutları etkinleştirir , örneğin ...

  • Tür django-admin.py.
  • Mevcut tüm seçenekleri görmek için [SEKME] tuşuna basın.
  • Tür sql, ardından [TAB] isimleri ile başlayan tüm kullanılabilir seçenekleri görmek için sql.

1
Bu beklediğimden daha faydalı. Teşekkürler!
Jeeyoung Kim

En azından yeni Ubuntu'da bu varsayılan olarak geçerlidir. :-) İlk ortaya çıktığında şaşırdım.
odinho - Velmont

40

./manage.py runserver_plusİle gelir Facilty django_extensions gerçekten harika.

Diğer şeylerin yanı sıra, yığındaki her nokta için etkileşimli hata ayıklama konsolları oluşturmak için Werkzeug hata ayıklayıcısını kullanan gelişmiş bir hata ayıklama sayfası oluşturur (ekran görüntüsüne bakın). Ayrıca, dump()bir nesne / çerçeve hakkında bilgi görüntülemek için çok kullanışlı bir kolaylık ayıklama yöntemi sağlar.

resim açıklamasını buraya girin

Yüklemek için pip kullanabilirsiniz:

pip install django_extensions
pip install Werkzeug

Ardından eklemek 'django_extensions'için için INSTALLED_APPSde tuple settings.pyve yeni uzantılı geliştirme sunucusunu başlatın:

./manage.py runserver_plus

Bu, hata ayıklama şeklinizi değiştirecektir.


37

Django projelerinde hata ayıklamak için Python hata ayıklayıcı pdb kullanmayı seviyorum.

Bu, nasıl kullanılacağını öğrenmek için yararlı bir bağlantıdır: http://www.ferg.org/papers/debugging_in_python.html


13
Bu bir nimettir. Biraz daha bilgi vermek için şunu ekleyin: "import pdb; pdb.set_trace ()" kodunuzun herhangi bir satırına. Sayfanızı yenileyin. Asacak. Şimdi geliştirme sunucusunu çalıştırdığınız terminal pencerenize gidin. Artık, tüm değişkenlere kodunuzda hata ayıklama kodunu yapıştırdığınız noktada erişebildikleri etkileşimli bir kabuk olmalıdır.
priestc


36

Jinja2'yi Django ile birlikte kullanın .

Django şablon dilini son derece kısıtlayıcı bulursanız (benim gibi!) O zaman ona takılı kalmanız gerekmez. Django esnektir ve şablon dili sistemin geri kalanına gevşek bir şekilde bağlanmıştır, bu yüzden başka bir şablon dili takın ve http yanıtlarınızı oluşturmak için kullanın!

Kullandığım jinja2 , neredeyse Django şablon dili powered-up versiyonu gibi, aynı sözdizimini kullanır ve tablolar halinde ifadeleri kullanmasını sağlar oluyor! artık özel bir if-etiket yapma if_item_in_list! basitçe söyleyebilirsin %{ if item in list %}, ya da {% if object.field < 10 %}.

Ama hepsi bu değil; şablon oluşturmayı kolaylaştırmak için çok daha fazla özelliği var, hepsi burada olsa gidemem.


Jinja2'yi de kullanıyorum ve tadını çıkarıyorum, ancak "katkıda bulun" uygulamalarında bazı bağlantılar olduğunu gördüm. Özellikle, yönetici aracı oldukça ağır Django şablonlarına bağlıdır. Ayrıca, giriş dekoratörleri katkıda bulunmak zorunda kaldım. Jinja2 dostu olmak için, ama çok zor değil.
Joe Holloway

24
Şablon sistemini jinja2 ile değiştirmeyin, sadece "ekleyin", django şablonlarını kaldırmayın. Kendi görünümleriniz için Jinja2'yi kullanın ve yönetici arayüzünün django şablon dilini kullanmaya devam etmesine izin verin.
hasen

4
Buna katılıyorum. Django'nun sınırlı sözdizimi çoğu zaman tolere edilebilir, ancak özel etiketler yapma noktasına geldiğinizde ve bunun ne kadar zor olduğunu öğrendiğinizde, Jinja2 temiz bir nefes alır
SingleNegationElimination

Ayrıca, şablon kaynağında herhangi bir metaprogramlama yapmak istiyorsanız , Jinja2 çok daha hoştur, çünkü ayrıştırılmış şablonların AST'sine doğrudan erişebilirsiniz. AST'yi yürümek, hangi şablonların bir temel şablonu genişlettiğini bulmak ya da bir şablon kaynak bloğundaki ilişkisiz değişkenleri listelemek gibi görevleri hemen hemen çok kolay hale getirir.
rcoder

5
Neyse ki Django 1.2'de IF etiketi çok daha akıllı
Nixarn

35

assert FalseHata ayıklama bilgilerini dökmek için görünüm kodunuzu ekleyin .


4
Sanırım iddia False daha sezgisel = D
Jiaaro

13
projenizi django dev sunucusunda çalıştırıyorsanız, python'un pdb modülünü kullanın. Hata ayıklamanın çok daha güçlü bir yolu: import pdb; pdb.stack_trace ()
mazelife

pdb çok kullanışlıdır, hata ayıklama konusunda çok hızlı değilseniz bağlantılarınızın zaman aşımına uğraması muhtemeldir.
Stephen Paulger

4
Her zaman 5 / 0kendimi kullanırım . Neden beş? Fikrim yok.
JasonSmith

@StephenPaulger gerçekten mi? Tarayıcım (firefox / w firebug) hata ayıklarken bir yanıt için birkaç dakika bekleyecek içerik gibi görünüyor.
TM.

34

Bu, Django URL adları ve ters URL gönderme hakkında yukarıdaki yanıtı ekler .

URL adları şablonlar içinde de etkili bir şekilde kullanılabilir. Örneğin, belirli bir URL modeli için:

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

şablonlarda aşağıdakilere sahip olabilirsiniz:

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

27

Django "görünümlerinin" yalnızca bir HttpResponse döndüren callables olması gerektiğinden, Ruby on Rails ve diğer çerçevelerdeki gibi sınıf tabanlı görünümleri kolayca oluşturabilirsiniz.

Sınıf tabanlı görünümler oluşturmanın birkaç yolu vardır, işte benim favorim:

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

Temel görünümünüze koşullu istek işleme ve yetkilendirme gibi her türlü şeyi ekleyebilirsiniz.

Görüşlerinizi oluşturduktan sonra urls.py aşağıdaki gibi görünecektir:

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

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

2
FWIW, django yazarları aslında birkaç yerde sınıf tabanlı görünümler kullanıyorlar, örneğin, katkıda.formtools: code.djangoproject.com/browser/django/trunk/django/contrib/…
mazelife

3
Bir çağrı yöntemi eklerseniz RestfulResource adlı bir sınıf oluşturabilir ve urls.py öğelerinizi örneklere yönlendirebilirsiniz.
Stephen Paulger

1
Yeni (Django 1.3?) Genel görünümler sınıf tabanlıdır.
gorsky

21

render_to_responseBağlamınızı bir şablona bağlamak ve oluşturmak için kullanmak yerine ( Django dokümanlarının genellikle gösterdiği şey) genel görünümü kullanır direct_to_template. Aynı şeyi render_to_responseyapar, ancak aynı zamanda otomatik olarak RequestContext'i şablon bağlamına ekleyerek dolaylı olarak bağlam işlemcilerinin kullanılmasına izin verir. Bunu kullanarak manuel olarak yapabilirsiniz render_to_response, ama neden rahatsız ettiniz ? Hatırlamak için sadece bir adım ve başka bir LOC. Bağlam işlemcilerini kullanmanın yanı sıra, şablonunuzda RequestContext olması aşağıdakileri yapmanızı sağlar:

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

ki bu çok faydalı. Aslında, genel olarak genel görünümler için +1. Django belgeleri, bunları basit uygulamalar için views.py dosyasına bile sahip olmadıkları için kısayol olarak gösterir, ancak bunları kendi görünüm işlevlerinizde de kullanabilirsiniz:

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}
    )

Django sinir bozucu mevcut @render_to dekoratör kullanarak daha fazla LOC kaydedin. bitbucket.org/offline/django-annoying
pithyless

6
..veyarender Django 1.3'ten yeni bir kısayol yöntemi kullanın ( docs.djangoproject.com/en/dev/topics/http/shortcuts/#render )
gorsky

20

Söz konusu yoruma cevap vermek için yeterli üne sahip değilim, ancak Jinja'yı kullanacaksanız , Django bunu yaparken şablon bloğu adlarında '-' karakterini desteklemediğini belirtmek önemlidir . Bu bana çok fazla sorun yarattı ve oluşturduğu çok belirsiz hata mesajını izlemeye çalışırken zaman kaybetti.


"Jinja'dan gelen belirsiz hata mesajlarına" uygulanabilen veya uygulanamayan bir not. Settings.py dosyasında TEMPLATE_DEBUG = False değerini ayarladığınızdan emin olun. Nedense bu size Jinja şablonlarından anlamlı hatalar verecektir.
Carl G

19

Webdesign uygulama web sitesi tasarımı başlarken çok yararlıdır. İçe aktarıldıktan sonra, örnek metin oluşturmak için bunu ekleyebilirsiniz:

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

4
FYI, Django şablonları yerine Jinja2 kullanan herkes için şunları yapabilirsiniz: {{lipsum (5)}}
Joe Holloway


19

Herkes "manage.py runserver" ile çalıştırabileceğiniz bir geliştirme sunucusu olduğunu biliyor, ancak statik dosyaları (CSS / JS / IMG) sunmak için de bir geliştirme görünümü olduğunu biliyor muydunuz?

Yeni gelenler her zaman şaşırır, çünkü Django statik dosya sunmak için herhangi bir yolla gelmez. Bunun nedeni, dev ekibinin bunun gerçek bir Web sunucusunun işi olduğunu düşünmesidir.

Ancak geliştirirken, Apache + mod_wisgi'yi kurmak istemeyebilirsiniz, bu ağırdır. Ardından urls.py dosyasına aşağıdakileri ekleyebilirsiniz:

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

CSS / JS / IMG'niz www.yoursite.com/site_media/ adresinde bulunabilir.

Tabii ki, bunu bir üretim ortamında kullanmayın.


6
Bunu dev modunda kullanıyorum ve sadece bunu üretimde kapatmayı unutmadığımdan emin olmak için, URL kuralını yalnızca koşullu bir DEBUG'a sarıyorum.
sghael

18

Bunu sorl küçük resimlerin belgelerinden öğrendim uygulamasının . Şablonun başka bir yerinde aramanın sonuçlarını kullanmak için şablon etiketlerindeki "as" anahtar sözcüğünü kullanabilirsiniz.

Örneğin:

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

Bu, Django şablon etiketi belgelerinden geçirilirken, ancak yalnızca döngülerden bahsedilir. Bunu başka bir yerde (herhangi bir yerde?) De kullanabileceğinizi söylemiyorlar.


7
Şablon etiketi ile "as" gibi bir anahtar kelime kullanılabiliyorsa bu belirli etikete bağlıdır. Django tarafından değil, anlamlarına bağlı olarak tek etiketlerle tanımlanır. "As" ifadesinin
vikingosegundo


16

PyCharm IDE , Django için yerleşik destekle kodlamak ve özellikle hata ayıklamak için güzel bir ortamdır.


14

Xml_models kullanXML REST API arka ucu (SQL yerine) kullanan Django modelleri oluşturmak için . Bu, özellikle üçüncü taraf API'leri modellerken çok kullanışlıdır - alışık olduğunuzla aynı QuerySet sözdizimini edinirsiniz. PyPI'den yükleyebilirsiniz.

Bir API'dan XML:

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

Ve şimdi python'da:

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'

Aynı zamanda ilişkiler ve koleksiyonları da ele alabilir. Her gün yoğun olarak kullanılan üretim kodunda kullanıyoruz, bu yüzden beta olmasına rağmen çok kullanışlı. Ayrıca, testlerinizde kullanabileceğiniz iyi bir taslak setine sahiptir.

(Feragatname: Bu kütüphanenin yazarı olmasam da, şimdi birkaç ufak taahhütte bulundum.


ilginç bir proje, devam et!
Sergey Golovchenko

Teşekkürler, oldukça kullanışlı :-)
godswearhats

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.