जवाबों:
मैं बस अपने आप से एक टिप के साथ शुरू करने जा रहा हूँ :)
हार्डकोड किए गए डीरनेम से बचने के लिए settings.py में os.path.dirname () का उपयोग करें।
यदि आप अपने प्रोजेक्ट को विभिन्न स्थानों पर चलाना चाहते हैं, तो अपनी सेटिंग में हार्डकोड पथ न करें। यदि आपका टेम्प्लेट और स्थिर फ़ाइलें 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"),
)
श्रेय: मुझे यह टिप स्क्रैनास्ट ' Django फ्रॉम द ग्राउंड अप ' से मिली है ।
j = lambda filename: os.path.join(PROJECT_DIR, filename)
:। फिर आपको सिर्फ टाइप करना होगा j("static")
।
wontfix
निर्णय।
Django कमांड एक्सटेंशन और pygraphviz स्थापित करें और फिर वास्तव में एक अच्छी दिखने वाली Django मॉडल दृश्य प्राप्त करने के लिए निम्न आदेश जारी करें:
./manage.py graph_models -a -g -o my_project.png
इसके बजाय django- कष्टप्रद render_to
डेकोरेटर का उपयोग करें 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))
यह इंगित करने के लिए संपादित किया गया कि HttpResponse (जैसे पुनर्निर्देशन) लौटाना डेकोरेटर को शॉर्ट सर्किट करेगा और आपकी अपेक्षा के अनुरूप काम करेगा।
वहाँ कस्टम टैग का एक सेट है जो मैं अपनी साइट के सभी टेम्प्लेट का उपयोग करता हूं। यह ऑटोलैड के लिए एक रास्ता खोज रहा है (DRY, याद है?), मैंने निम्नलिखित पाया:
from django import template
template.add_to_builtins('project.app.templatetags.custom_tag_module')
यदि आप इसे डिफ़ॉल्ट रूप से लोड किए गए मॉड्यूल (उदाहरण के लिए आपका मुख्य urlconf) में रखते हैं, तो आपके पास आपके कस्टम टैग मॉड्यूल से किसी भी टेम्पलेट में उपलब्ध टैग और फ़िल्टर होंगे, बिना उपयोग किए {% load custom_tag_module %}
।
तर्क template.add_to_builtins()
किसी भी मॉड्यूल पथ हो सकता है; आपके कस्टम टैग मॉड्यूल को एक विशिष्ट एप्लिकेशन में नहीं रहना है। उदाहरण के लिए, यह आपकी परियोजना की मूल निर्देशिका (जैसे। 'project.custom_tag_module'
) में एक मॉड्यूल भी हो सकता है ।
Virtualenv + पायथन = जीवन रक्षक यदि आप कई Django परियोजनाओं पर काम कर रहे हैं और एक संभावना है कि वे सभी Django / एक आवेदन के एक ही संस्करण पर निर्भर नहीं करते हैं।
virtualenv myNewEnv --no-site-packages
:; . myNewEnv/bin/activate
; pip install django
; और यह सिर्फ काम करता है!
अपने URL को हार्ड-कोड न करें!
उपयोग यूआरएल के नाम के बजाय, और reverse
समारोह URL को देखने के लिए।
जब आप अपने URL मैपिंग को परिभाषित करते हैं, तो अपने URL को नाम दें।
urlpatterns += ('project.application.views'
url( r'^something/$', 'view_function', name="url-name" ),
....
)
सुनिश्चित करें कि नाम प्रति URL अद्वितीय है।
मेरे पास आमतौर पर एक सुसंगत प्रारूप "प्रोजेक्ट-एप्लायंस-व्यू" है, उदाहरण के लिए "सीबीएक्स-फोरम-थ्रेड" एक थ्रेड दृश्य के लिए।
अद्यतन (बेशर्मी से अय्याशी के अलावा चोरी ):
इस नाम का उपयोग url
टैग के साथ टेम्प्लेट में किया जा सकता है ।
url
टैग का उपयोग नहीं करता है ... उनका रुख यह है कि urls वैसे भी नहीं बदलना चाहिए (यदि आप अपने अनुकूल होना चाहते हैं उपयोगकर्ता)।
{% url path.to.view.name arg1 arg2 %}
docs.djangoproject.com/en/dev/ref/templates/builtins/… में
reverse
इस तरह जोड़ें environment.filters['url'] = django.core.urlresolvers.reverse
और आप इसे अपने टेम्पलेट्स में इस तरह से उपयोग कर सकते हैं: {{ 'view-name'|url(arg1, arg2)|e }}
(HTML में शामिल करने के लिए कुछ वर्णों से बचने के लिए "e" की आवश्यकता है)
Django डीबग टूलबार का उपयोग करें । उदाहरण के लिए, यह दृश्य प्रदान करते समय किए गए सभी एसक्यूएल प्रश्नों को देखने की अनुमति देता है और आप उनमें से किसी के लिए स्टैकट्रेस भी देख सकते हैं।
अपने लॉगिन पृष्ठ न लिखें। यदि आप django.contrib.auth का उपयोग कर रहे हैं।
वास्तविक, गंदा रहस्य यह है कि यदि आप django.contrib.admin, और django.template.loaders.app_directories.load_template_source का उपयोग कर रहे हैं, तो अपने टेम्पलेट लोडर में हैं, तो आप अपने टेम्पलेट्स को निःशुल्क प्राप्त कर सकते हैं!
# somewhere in urls.py
urlpatterns += patterns('django.contrib.auth',
(r'^accounts/login/$','views.login', {'template_name': 'admin/login.html'}),
(r'^accounts/logout/$','views.logout'),
)
कहें कि आपके पास एक अलग उपयोगकर्ता मॉडल है और आप इसे हर प्रतिक्रिया में शामिल करना चाहते हैं। ऐसा करने के बजाय:
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))
संदर्भ प्रक्रियाएं आपको किसी भी चर को अपने टेम्पलेट में पारित करने की क्षमता देती हैं। मैं आमतौर पर मेरा में डाल दिया '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='')
अपने settings.py
जोड़ने के लिए अपने निम्नलिखित पंक्ति मेंTEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS = (
'my_project.apps.core.context.my_context',
...
)
अब हर बार अनुरोध किया जाता है कि इसमें my_user
कुंजी अपने आप शामिल हो जाए।
मैंने कुछ महीने पहले इस बारे में एक ब्लॉग पोस्ट लिखा था, इसलिए मैं सिर्फ कट और पेस्ट करने जा रहा हूं:
बॉक्स से बाहर Django आपको कई संकेत देता है जो अविश्वसनीय रूप से उपयोगी हैं। आपके पास अनुरोध को संसाधित किए जाने के समय, पूर्ववत और पोस्ट सेव, इनिट, डिलीट या यहां तक कि चीजों को करने की क्षमता है। तो अवधारणाओं से दूर हो जाते हैं और प्रदर्शित करते हैं कि ये कैसे उपयोग किए जाते हैं। कहें कि हमें एक ब्लॉग मिल गया है
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)
तो किसी तरह आप कई ब्लॉग-पिंगिंग सेवाओं में से एक को सूचित करना चाहते हैं जिसे हमने एक नया पोस्ट बनाया है, सबसे हाल के पोस्ट कैश का पुनर्निर्माण करें, और इसके बारे में ट्वीट करें। अच्छी तरह से संकेतों के साथ आप पोस्ट क्लास में किसी भी तरीके को जोड़ने के बिना यह सब करने की क्षमता रखते हैं।
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)
वहाँ हम उस फ़ंक्शन को परिभाषित करके और पोस्ट मॉडल से फ़ंक्शन को जोड़ने के लिए पोस्ट_इनिट सिग्नल का उपयोग करके इसे सहेजने के बाद निष्पादित करते हैं।
जब मैं शुरू कर रहा था, मुझे नहीं पता था कि एक Paginator था , सुनिश्चित करें कि आप इसके अस्तित्व के बारे में जानते हैं !!
किसी भी स्तर पर अपने कोड में कूदने के लिए IPython का उपयोग करें और IPython की शक्ति का उपयोग करके डिबग करें। एक बार जब आप IPython स्थापित कर लेते हैं, तो इस कोड को जहाँ भी आप डिबग करना चाहते हैं, डाल दें:
from IPython.Shell import IPShellEmbed; IPShellEmbed()()
फिर, पृष्ठ को रिफ्रेश करें, अपनी रनर विंडो पर जाएं और आप एक इंटरैक्टिव IPython विंडो में होंगे।
मेरे पास TextMate में एक स्निपेट है, इसलिए मैं सिर्फ ipshell और हिट टैब टाइप करता हूं। मैं इसके बिना नहीं रह सकता।
ipdb
और फिर बस टाइप करेंipdb.set_trace()
एक विकास एसएमटीपी सर्वर चलाएं जो इसे भेजे जाने पर बस आउटपुट देगा (यदि आप वास्तव में एसएमटीपी को अपने देव सर्वर पर स्थापित नहीं करना चाहते हैं।)
कमांड लाइन:
python -m smtpd -n -c DebuggingServer localhost:1025
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
.. manage.py
आउटपुट के लिए ईमेल प्रिंट करेगा ।
से Django-व्यवस्थापक प्रलेखन :
यदि आप बैश शेल का उपयोग करते हैं, तो Django बैश पूर्ण स्क्रिप्ट स्थापित करने पर विचार करें, जो extras/django_bash_completion
Django वितरण में रहता है । यह टैब django-admin.py
और manage.py
आदेशों को पूरा करने में सक्षम बनाता है , इसलिए आप उदाहरण के लिए ...
django-admin.py
।sql
, फिर [TAB], सभी उपलब्ध विकल्पों को देखने के लिए जिनके नाम से शुरू होता है sql
।./manage.py runserver_plus
Facilty जो के साथ आता है django_extensions वास्तव में भयानक है।
यह एक उन्नत डिबग पृष्ठ बनाता है, जो अन्य बातों के अलावा, स्टैक में प्रत्येक बिंदु के लिए इंटरैक्टिव डिबगिंग कंसोल बनाने के लिए Werkzeug डीबगर का उपयोग करता है (स्क्रीनशॉट देखें)। यह dump()
एक वस्तु / फ्रेम के बारे में जानकारी प्रदर्शित करने के लिए एक बहुत ही उपयोगी सुविधा डिबगिंग विधि भी प्रदान करता है ।
स्थापित करने के लिए, आप पाइप का उपयोग कर सकते हैं:
pip install django_extensions
pip install Werkzeug
फिर 'django_extensions'
अपने INSTALLED_APPS
tuple में जोड़ें settings.py
और नए एक्सटेंशन के साथ विकास सर्वर शुरू करें:
./manage.py runserver_plus
यह आपके डिबग करने के तरीके को बदल देगा।
मैं Django परियोजनाओं को डीबग करने के लिए पायथन डीबगर पीडीडी का उपयोग करना पसंद करता हूं।
यह कैसे उपयोग करने के लिए सीखने के लिए एक उपयोगी लिंक है: http://www.ferg.org/papers/debugging_in_python.html
जब Django और एक अन्य अनुप्रयोग के बीच डेटा का आदान-प्रदान करने की कोशिश कर रहा है, request.raw_post_data
एक अच्छा दोस्त है। XML डेटा प्राप्त करने और कस्टम-प्रोसेस करने के लिए इसका उपयोग करें।
प्रलेखन: http://docs.djangoproject.com/en/dev/ref/request-response/
Django के साथ Jinja2 का उपयोग करें ।
अगर आपको Django टेम्प्लेट लैंग्वेज बेहद सीमित लगती है (मेरी तरह!) तो आपको इसके साथ अटकना नहीं है। Django लचीली है, और टेम्प्लेट लैंग्वेज बाकी सिस्टम से बहुत अच्छी तरह से जुड़ी हुई है, इसलिए सिर्फ दूसरी टेम्प्लेट लैंग्वेज में प्लग-इन करें और अपने http रिस्पॉन्स को रेंडर करने के लिए इसका इस्तेमाल करें!
मैं जिनजा 2 का उपयोग करता हूं , यह लगभग django टेम्पलेट भाषा के एक संचालित-अप संस्करण की तरह है, यह एक ही वाक्यविन्यास का उपयोग करता है, और यदि आप कथन में अभिव्यक्ति का उपयोग करने की अनुमति देते हैं! कोई और अधिक कस्टम बना रहा है जैसे कि टैग if_item_in_list
! आप बस कह सकते हैं %{ if item in list %}
, या {% if object.field < 10 %}
।
लेकिन वह सब नहीं है; टेम्प्लेट निर्माण को आसान बनाने के लिए कई और सुविधाएँ हैं, कि मैं उन सभी को यहाँ नहीं जा सकता।
assert False
डिबग जानकारी डंप करने के लिए अपने दृश्य कोड में जोड़ें ।
5 / 0
खुद का इस्तेमाल करता हूं। पांच क्यों? कोई जानकारी नहीं।
यह Django URL नामों और रिवर्स URL प्रेषण के बारे में ऊपर दिए गए उत्तर में जोड़ता है ।
URL नाम का उपयोग टेम्प्लेट के भीतर भी प्रभावी रूप से किया जा सकता है। उदाहरण के लिए, दिए गए URL पैटर्न के लिए:
url(r'(?P<project_id>\d+)/team/$', 'project_team', name='project_team')
आप टेम्प्लेट में निम्नलिखित हो सकते हैं:
<a href="{% url project_team project.id %}">Team</a>
चूंकि Django "विचारों" को केवल कॉलवेबल्स की आवश्यकता होती है जो एक HttpResponse लौटाते हैं, आप आसानी से रूबी ऑन रेल्स और अन्य फ्रेमवर्क जैसे क्लास-आधारित विचार बना सकते हैं।
कक्षा-आधारित विचार बनाने के कई तरीके हैं, यहाँ मेरा पसंदीदा है:
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
आप अपने बेस व्यू में सशर्त अनुरोध से निपटने और प्राधिकरण जैसे अन्य सामान जोड़ सकते हैं।
एक बार जब आप अपने विचार सेट कर लेते हैं तो आपका urls.py कुछ इस तरह दिखाई देगा:
from django.conf.urls.defaults import *
from views import MyRestView
urlpatterns = patterns('',
(r'^restview/', MyRestView.dispatch),
)
render_to_response
अपने संदर्भ को टेम्प्लेट में बाँधने के लिए उपयोग करने के बजाय और इसे प्रस्तुत करें (जो कि Django डॉक्स आमतौर पर दिखाते हैं) जेनेरिक दृश्य का उपयोग करते हैं direct_to_template
। यह वही कार्य render_to_response
करता है जो करता है, लेकिन यह स्वचालित रूप से टेम्प्लेट के संदर्भ में RequestContext को जोड़ता है, जिसका अर्थ है कि संदर्भ प्रोसेसर का उपयोग करने की अनुमति है। आप इसे मैन्युअल रूप से उपयोग कर सकते हैंrender_to_response
, लेकिन परेशान क्यों? यह याद रखने का एक और कदम है और दूसरा LOC। संदर्भ प्रोसेसर का उपयोग करने के अलावा, आपके टेम्पलेट में RequestContext होने से आप निम्न कार्य कर सकते हैं:
<a href="{{MEDIA_URL}}images/frog.jpg">A frog</a>
जो बहुत उपयोगी है। वास्तव में, सामान्य रूप से सामान्य विचारों पर +1। Django डॉक्स ज्यादातर साधारण ऐप्स के लिए एक view.py फ़ाइल नहीं होने के लिए शॉर्टकट के रूप में दिखाते हैं, लेकिन आप उन्हें अपने स्वयं के दृश्य कार्यों के अंदर भी उपयोग कर सकते हैं:
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 से नए शॉर्टकट विधि का उपयोग करें ( docs.djangoproject.com/en/dev/topics/http/shortcuts/#render )
प्रश्न में टिप्पणी का जवाब देने के लिए मेरे पास पर्याप्त प्रतिष्ठा नहीं है, लेकिन यह ध्यान रखना महत्वपूर्ण है कि यदि आप जिन्जा का उपयोग करने जा रहे हैं , तो यह टेम्पलेट ब्लॉक नामों में '-' वर्ण का समर्थन नहीं करता है, जबकि Django करता है। इसने मुझे बहुत सारी समस्याएं पैदा कीं और समय की बर्बादी के कारण बहुत अस्पष्ट त्रुटि संदेश को उत्पन्न करने की कोशिश की।
वेब डिज़ाइन एप्लिकेशन जब अपनी वेबसाइट डिजाइन करने के लिए शुरू करने के लिए बहुत उपयोगी है। एक बार आयात होने के बाद, आप इसे नमूना पाठ उत्पन्न करने के लिए जोड़ सकते हैं:
{% load webdesign %}
{% lorem 5 p %}
django.db.models.get_model
आपको किसी मॉडल को आयात किए बिना पुनर्प्राप्त करने की अनुमति देता है।
जेम्स दिखाता है कि यह कितना आसान हो सकता है: "Django युक्तियाँ: बेहतर टेम्पलेट टैग लिखें - Iteration 4" ।
हर कोई जानता है कि एक ऐसा विकास सर्वर है जिसे आप "मैनेजमेडो रनसेवर" के साथ चला सकते हैं, लेकिन क्या आप जानते हैं कि स्थिर फ़ाइलों (सीएसएस / जेएस / आईएमजी) के लिए भी एक विकास दृश्य है?
नवागंतुकों को हमेशा हैरान किया जाता है क्योंकि Django स्थिर फ़ाइलों की सेवा करने के लिए किसी भी तरह से नहीं आता है। यह इसलिए है क्योंकि देव टीम को लगता है कि यह एक वास्तविक जीवन वेब सर्वर के लिए काम है।
लेकिन विकसित करते समय, आप Apache + mod_wisgi को सेट करना नहीं चाहेंगे, यह भारी है। तो आप बस urls.py के लिए निम्नलिखित जोड़ सकते हैं:
(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': '/path/to/media'}),
आपका CSS / JS / IMG www.yoursite.com/site_media/ पर उपलब्ध होगा।
बेशक, इसे उत्पादन वातावरण में उपयोग न करें।
मैंने इसे sorl-थंबनेल के प्रलेखन से सीखा है ऐप के । आप अपने टेम्प्लेट में कहीं और कॉल के परिणामों का उपयोग करने के लिए टेम्प्लेट टैग में "के रूप में" कीवर्ड का उपयोग कर सकते हैं।
उदाहरण के लिए:
{% url image-processor uid as img_src %}
<img src="{% thumbnail img_src 100x100 %}"/>
यह Django templatetag प्रलेखन में पारित करने के लिए उल्लेख किया गया है, लेकिन केवल लूप के संदर्भ में। वे यह नहीं कहते हैं कि आप कहीं और (कहीं भी?) इसका उपयोग कर सकते हैं।
django.views.generic.list_detail.object_list - यह पेजिनेशन के लिए सभी लॉजिक और टेम्प्लेट वैरिएबल प्रदान करता है (उनमें से एक जो मैंने लिखा है-एक-हज़ार-अब-बार शराबी)। इसे लपेटकर आपको किसी भी तर्क की आवश्यकता होती है। इस रत्न ने मुझे मेरे "खोज परिणाम" पृष्ठों में ऑफ-बाय-वन त्रुटियों को डीबग करने के कई घंटे बचाए हैं और इस प्रक्रिया में व्यू कोड क्लीनर बनाता है।
PyCharm IDE कोड और विशेष रूप से डिबग के लिए एक अच्छा वातावरण है, जिसमें Django के लिए अंतर्निहित समर्थन है।
उपयोग xml_models Django मॉडल है कि एक एक्सएमएल REST API बैकएंड (बजाय एक एसक्यूएल एक) का उपयोग बनाने के लिए। यह विशेष रूप से उपयोगी है जब विशेष रूप से थर्ड पार्टी एपीआई को मॉडलिंग करते हैं - आपको सभी समान क्वेरीसेट सिंटैक्स मिलते हैं जो आपके लिए उपयोग किए जाते हैं। आप इसे PyPI से इंस्टॉल कर सकते हैं।
एक एपीआई से 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>
और अब अजगर में:
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'
यह रिश्तों और संग्रह को भी संभाल सकता है। हम इसका उपयोग हर दिन भारी उपयोग किए जाने वाले उत्पादन कोड में करते हैं, इसलिए बीटा के होने के बावजूद यह बहुत उपयोगी है। इसमें स्टब्स का एक अच्छा सेट भी है जिसे आप अपने परीक्षणों में उपयोग कर सकते हैं।
(अस्वीकरण: जबकि मैं इस पुस्तकालय का लेखक नहीं हूं, अब मैं एक कमिटेटर हूं, कुछ मामूली कमिट कर चुका हूं)