Yanıtlar:
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 .
j = lambda filename: os.path.join(PROJECT_DIR, filename)
. O zaman yazmanız yeterlidir j("static")
.
wontfix
kararı yeniden değerlendirmesini isteyin .
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
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.
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'
).
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.
virtualenv myNewEnv --no-site-packages
:; . myNewEnv/bin/activate
; pip install django
; Ve sadece işe yarıyor!
URL'lerinizi kodlamayın!
Kullan url isimleri yerine ve reverse
fonksiyon 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 url
etiketli şablonlarda kullanılabilir .
url
etiketi bile kullanmadığını söyledi ... Duruşu , URL'lerin yine de değişmemesi gerektiğidir ( kullanıcılar).
{% url path.to.view.name arg1 arg2 %}
docs.djangoproject.com/en/dev/ref/templates/builtins/… '
reverse
bu şekilde ekleyin environment.filters['url'] = django.core.urlresolvers.reverse
ve ş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)
Django hata ayıklama araç çubuğunu kullanın . Örneğin, görünüm oluştururken gerçekleştirilen tüm SQL sorgularını görüntülemenize olanak tanır ve bunlardan herhangi biri için yığın izlemesini de görüntüleyebilirsiniz.
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'),
)
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.py
eklenti için çizgi izleyen seninTEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS = (
'my_project.apps.core.context.my_context',
...
)
Şimdi her istek yapıldığında my_user
anahtar otomatik olarak içeriyor .
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.
Başlarken, bir Sayfacı olduğunu bilmiyordum, varlığını bildiğinizden emin olun !!
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.
ipdb
ve sonra sadece yazınipdb.set_trace()
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
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
..bu manage.py
çıktıya e-posta yazdıracak .
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.py
ve manage.py
komutları etkinleştirir , örneğin ...
django-admin.py
.sql
, ardından [TAB] isimleri ile başlayan tüm kullanılabilir seçenekleri görmek için sql
../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.
Yüklemek için pip kullanabilirsiniz:
pip install django_extensions
pip install Werkzeug
Ardından eklemek 'django_extensions'
için için INSTALLED_APPS
de tuple settings.py
ve yeni uzantılı geliştirme sunucusunu başlatın:
./manage.py runserver_plus
Bu, hata ayıklama şeklinizi değiştirecektir.
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
Django ve başka bir uygulama arasında veri alışverişi yapmaya çalışırken, request.raw_post_data
iyi bir arkadaştır. XML verilerini almak ve özel işlemek için kullanın.
Belgeler: http://docs.djangoproject.com/en/dev/ref/request-response/
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.
assert False
Hata ayıklama bilgilerini dökmek için görünüm kodunuzu ekleyin .
5 / 0
kendimi kullanırım . Neden beş? Fikrim yok.
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>
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),
)
render_to_response
Bağ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_response
yapar, 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}
)
render
Django 1.3'ten yeni bir kısayol yöntemi kullanın ( docs.djangoproject.com/en/dev/topics/http/shortcuts/#render )
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.
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 %}
django.db.models.get_model
bir modeli içe aktarmadan almanıza olanak tanır.
James ne kadar kullanışlı olabileceğini gösteriyor: "Django ipuçları: Daha iyi şablon etiketleri yazın - Yineleme 4" .
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.
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.
django.views.generic.list_detail.object_list - Sayfalama için tüm mantık ve şablon değişkenlerini sağlar. Sarmak, ihtiyacınız olan herhangi bir mantığa izin verir. Bu mücevher "Arama Sonuçları" sayfalarımda hata ayıklama hatalarını saatlerce kurtardı ve süreçte görünüm kodunu daha temiz yapar.
PyCharm IDE , Django için yerleşik destekle kodlamak ve özellikle hata ayıklamak için güzel bir ortamdır.
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.