पसंदीदा Django युक्तियाँ और सुविधाएँ?


308

प्रश्न श्रृंखला 'हिडन फीचर्स ऑफ ...' से प्रेरित, मैं आपके पसंदीदा Django टिप्स या कम ज्ञात लेकिन उपयोगी विशेषताओं के बारे में सुनने के लिए उत्सुक हूं।

  • कृपया, प्रति उत्तर केवल एक टिप शामिल करें।
  • यदि कोई हो तो Django संस्करण आवश्यकताओं को जोड़ें।

जवाबों:


221

मैं बस अपने आप से एक टिप के साथ शुरू करने जा रहा हूँ :)

हार्डकोड किए गए डीरनेम से बचने के लिए 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 फ्रॉम द ग्राउंड अप ' से मिली है ।


75
आपको ऐसे लोगों को नहीं छोड़ना चाहिए जो अपने स्वयं के प्रश्नों का उत्तर देते हैं इसे प्रोत्साहित किया जाता है, भले ही यह पूर्व निर्धारित हो।
पाओलो बरगीनो

19
यह इतना अच्छा विचार है कि मुझे अभी भी समझने में मुश्किल है कि यह डिफ़ॉल्ट क्यों नहीं है। एक ही मशीन पर कितने लोग परीक्षण और तैनाती करते हैं?
सिंगलनेगलाइजेशन क्लेम

19
यह आपको हमेशा os.path.join () टाइप करता है जो बहुत तेजी से परेशान करता है j = lambda filename: os.path.join(PROJECT_DIR, filename):। फिर आपको सिर्फ टाइप करना होगा j("static")
रे।

13
यदि आप विंडोज पर हैं तो बैकस्लैश को बदलें: os.path.join (PROJECT_DIR, "टेम्प्लेट")। प्रतिस्थापित करें ('\\', '/')
पीटर मोर्टेंसन

7
यदि आप वास्तव में इस Django में तय करने के लिए की तरह करने के लिए एक टिप्पणी छोड़ code.djangoproject.com/ticket/694 कोर devs पूछ पुनर्विचार करने के लिए wontfixनिर्णय।
सोरिन

128

Django कमांड एक्सटेंशन और pygraphviz स्थापित करें और फिर वास्तव में एक अच्छी दिखने वाली Django मॉडल दृश्य प्राप्त करने के लिए निम्न आदेश जारी करें:

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

अच्छा है, खिड़कियों में सही ढंग से स्थापित करने के लिए pygraphviz नहीं मिल सकता है, लेकिन फिर भी ग्राफविज़ का उपयोग करके डॉट फ़ाइल से कवर कर सकते हैं।
मोनकुट

मुझे यह निश्चित रूप से +1 के साथ मॉडल आरेख साझा करना पसंद है
BozoJoe

क्या इसके लिए svg विकल्प है?
कीवो

आउटपुट इमेज का भंडाफोड़ अब लगता है
ब्रायन विग्गिंटन

119

इसके बजाय 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 (जैसे पुनर्निर्देशन) लौटाना डेकोरेटर को शॉर्ट सर्किट करेगा और आपकी अपेक्षा के अनुरूप काम करेगा।


4
@ कमिंगगुरु - यह अपने आप होता है।
डोमिनिक रॉगर

15
यह ठीक है, जब तक कि आप कुछ HttpResponseRedirect () s और कुछ रेंडर_to_response () s वापस नहीं कर रहे हैं। फिर पुनर्निर्देश विफल हो जाते हैं।
मैथ्यू Schinckel

17
मुझे यह पसंद नहीं है। "स्पष्ट है निहित से बेहतर है"। डेकोरेटर यह नहीं बता रहा है कि यह रेंडर_टो कब जा रहा है।
तमसे सजेलेई

2
@ मैथ्यू सिनचेकेल वास्तव में इसे पुनर्निर्देशित नहीं करता है - यदि आप एक HttpResponse ऑब्जेक्ट को वापस करते हैं तो यह इसे संशोधित किए बिना इसे पास करता है
जियारो

20
मेरा मानना ​​है कि यह दृष्टिकोण अब Django 1.3 के रूप में बेमानी है, django.shortcuts.render () docs.djangoproject.com/en/dev/topics/http/shortcuts/#render
Dolph

101

वहाँ कस्टम टैग का एक सेट है जो मैं अपनी साइट के सभी टेम्प्लेट का उपयोग करता हूं। यह ऑटोलैड के लिए एक रास्ता खोज रहा है (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') में एक मॉड्यूल भी हो सकता है ।


@ सेफ़, आपने मुझे समय के भार से बचाया / दिल का दर्द / बाइट्स, धन्यवाद।
orokusaki

बहुत अच्छे। धन्यवाद। इसके अलावा कस्टम टैग का भंडार सामान साझा करने के लिए बहुत अच्छा होगा, क्या आपको नहीं लगता है?
लिएंड्रो अर्डीसोन

यह बहुत अच्छा है जब तक किसी और को अपना कोड बनाए रखना है। सोचें: "कम से कम जादू का सिद्धांत"
रिच

96

Virtualenv + पायथन = जीवन रक्षक यदि आप कई Django परियोजनाओं पर काम कर रहे हैं और एक संभावना है कि वे सभी Django / एक आवेदन के एक ही संस्करण पर निर्भर नहीं करते हैं।


15
यह केवल रोल करने का तरीका है!
पोस्टफुट्यूरिस्ट

3
क्या आप django के साथ virtualenv के लिए कुछ ट्यूटोरियल लिंक जोड़ सकते हैं?
BozoJoe

2
@BozoJoe: अपने टर्मिनल में ऐसा करें virtualenv myNewEnv --no-site-packages:; . myNewEnv/bin/activate; pip install django; और यह सिर्फ काम करता है!
सिंगलएनजेशन इलिमिनेशन

87

अपने URL को हार्ड-कोड न करें!

उपयोग यूआरएल के नाम के बजाय, और reverseसमारोह URL को देखने के लिए।

जब आप अपने URL मैपिंग को परिभाषित करते हैं, तो अपने URL को नाम दें।

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

सुनिश्चित करें कि नाम प्रति URL अद्वितीय है।

मेरे पास आमतौर पर एक सुसंगत प्रारूप "प्रोजेक्ट-एप्लायंस-व्यू" है, उदाहरण के लिए "सीबीएक्स-फोरम-थ्रेड" एक थ्रेड दृश्य के लिए।

अद्यतन (बेशर्मी से अय्याशी के अलावा चोरी ):

इस नाम का उपयोग urlटैग के साथ टेम्प्लेट में किया जा सकता है ।


1
मैं इस पर 100% सहमत हूं। मैंने हार्ड कोडित url का उपयोग करना शुरू कर दिया था, और जब मैंने कुछ बदलावों को समायोजित करने के लिए url प्रारूप को थोड़ा सा बदल दिया, तो यह मुझे एक परियोजना पर ले आया। मैंने वापस जाने और सब कुछ के माध्यम से खुदाई करने और कठिन कोडित url को बदलने के लिए समय लिया। मेरी एकमात्र बड़ी शिकायत यह है कि url टैग त्रुटियां पूरे पृष्ठ को मार देती हैं जबकि हार्ड कोडित केवल व्यक्तिगत लिंक को गड़बड़ करता है।
रिक्ती

21
यह एक छिपी हुई विशेषता नहीं होनी चाहिए, यह सर्वोत्तम अभ्यास और उड़ान भरने का एकमात्र तरीका है।
स्काईलार सैवलैंड

1
@skyl यह "उड़ान भरने का एकमात्र तरीका" है। मैं एक Django देव स्प्रिंट और एड्रियन Holovaty (Django के रचनाकारों में से एक) में था, उन्होंने कहा कि वह भी urlटैग का उपयोग नहीं करता है ... उनका रुख यह है कि urls वैसे भी नहीं बदलना चाहिए (यदि आप अपने अनुकूल होना चाहते हैं उपयोगकर्ता)।
टीएम।

आप इसका उपयोग टेम्प्लेट में भी कर सकते हैं, जैसे कि {% url path.to.view.name arg1 arg2 %} docs.djangoproject.com/en/dev/ref/templates/builtins/… में
एकलकरण संस्मरण

यदि आप jinja2 का उपयोग करते हैं, तो बस reverseइस तरह जोड़ें environment.filters['url'] = django.core.urlresolvers.reverseऔर आप इसे अपने टेम्पलेट्स में इस तरह से उपयोग कर सकते हैं: {{ 'view-name'|url(arg1, arg2)|e }}(HTML में शामिल करने के लिए कुछ वर्णों से बचने के लिए "e" की आवश्यकता है)
SingleNegationElimination

81

Django डीबग टूलबार का उपयोग करें । उदाहरण के लिए, यह दृश्य प्रदान करते समय किए गए सभी एसक्यूएल प्रश्नों को देखने की अनुमति देता है और आप उनमें से किसी के लिए स्टैकट्रेस भी देख सकते हैं।


79

अपने लॉगिन पृष्ठ न लिखें। यदि आप 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'),
)

1
ठंडा! मुझे नहीं पता था कि हम प्रवेश लॉगिन पृष्ठ का पुनः उपयोग कर सकते हैं। धन्यवाद!
जोशुआ अंश जोगी

66

कॉन्सेप्ट प्रोसेसर कमाल के हैं।

कहें कि आपके पास एक अलग उपयोगकर्ता मॉडल है और आप इसे हर प्रतिक्रिया में शामिल करना चाहते हैं। ऐसा करने के बजाय:

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)

वहाँ हम उस फ़ंक्शन को परिभाषित करके और पोस्ट मॉडल से फ़ंक्शन को जोड़ने के लिए पोस्ट_इनिट सिग्नल का उपयोग करके इसे सहेजने के बाद निष्पादित करते हैं।


4
वेब फ्रेमवर्क की तुलना करते हुए, इन दिनों Django के सिग्नल मेरे लिए एक आवश्यक विशेषता हैं। एक शिथिल युग्मित मंच लिखना, कहना, कि "सिग्नेचर" मॉड्यूल से अपडेट के लिए, कह सकते हैं, लेकिन वास्तव में काम करने के लिए उस मॉड्यूल की आवश्यकता नहीं होती है, और जो संगत मॉड्यूल के साथ काम कर सकता है, वही सुविधा लागू करता है, महान है। मुझे नहीं पता कि सिग्नल अधिक प्रसिद्ध और लोकप्रिय क्यों नहीं हैं।
ली बी

यदि हम अपनी परियोजना में कुछ पुन: प्रयोज्य एप्लिकेशन का उपयोग करते हैं तो सामान्य रूप से तंग युग्मन और कोड गड़बड़ से बचने के लिए सिग्नल बहुत महत्वपूर्ण हैं। आपने इसके लिए django ऐप्स के ढीले युग्मन के लिए एक उत्कृष्ट उदाहरण प्रदान किया।
लुकाज़ कोरज़ीस्की

क्या आपको पता है कि सिग्नल एसिंक्स हैं?
केदार

"कहो कि आपके पास एक अलग उपयोगकर्ता मॉडल है और आप इसे हर प्रतिक्रिया में शामिल करना चाहते हैं।" - उपयोगकर्ता को सत्र में रखें । जो आपको हर अनुरोध के लिए डेटाबेस हिट बचाता है।
जम्मों

सिग्नल की कॉल समकालिक हैं। मेरी राय में, कुछ प्रकार की अतुल्यकालिक नौकरी की व्यवस्था ट्विटर / फेसबुक / आदि (अर्थात - rabbitmq) पर प्रकाशित करने के लिए अधिक उपयुक्त है, इसलिए वेबसाइट के उपयोगकर्ता अनुरोध पर नहीं लटके।
गोर्स्की

58

जब मैं शुरू कर रहा था, मुझे नहीं पता था कि एक Paginator था , सुनिश्चित करें कि आप इसके अस्तित्व के बारे में जानते हैं !!


2
: मेरे लिए भी यही! मैंने पेजिंग पर दिन बिताए!
vikingosegundo

46

किसी भी स्तर पर अपने कोड में कूदने के लिए IPython का उपयोग करें और IPython की शक्ति का उपयोग करके डिबग करें। एक बार जब आप IPython स्थापित कर लेते हैं, तो इस कोड को जहाँ भी आप डिबग करना चाहते हैं, डाल दें:

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

फिर, पृष्ठ को रिफ्रेश करें, अपनी रनर विंडो पर जाएं और आप एक इंटरैक्टिव IPython विंडो में होंगे।

मेरे पास TextMate में एक स्निपेट है, इसलिए मैं सिर्फ ipshell और हिट टैब टाइप करता हूं। मैं इसके बिना नहीं रह सकता।


22
बेहतर स्थापित करें ipdbऔर फिर बस टाइप करेंipdb.set_trace()
टॉमस ज़ीलिस्की

या ग्रहण / प्यदेव की डिबगर का उपयोग करें। :-)
jMyles

3
आयात ipdb; ipdb.set_trace () FTW!
हस्सेक

43

एक विकास एसएमटीपी सर्वर चलाएं जो इसे भेजे जाने पर बस आउटपुट देगा (यदि आप वास्तव में एसएमटीपी को अपने देव सर्वर पर स्थापित नहीं करना चाहते हैं।)

कमांड लाइन:

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

12
आप एक ही उद्देश्य के लिए django 1.2 में कंसोल और फ़ाइल ईमेल बैकेंड का उपयोग कर सकते हैं
दिमित्री शेवचेंको

बकाया! पंजीकरण के लिए एकदम सही! +1
बूझोओ

3
Django 1.2 में सेटिंग्स के साथ वैकल्पिक: EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' .. manage.pyआउटपुट के लिए ईमेल प्रिंट करेगा ।
vdboor

41

से Django-व्यवस्थापक प्रलेखन :

यदि आप बैश शेल का उपयोग करते हैं, तो Django बैश पूर्ण स्क्रिप्ट स्थापित करने पर विचार करें, जो extras/django_bash_completionDjango वितरण में रहता है । यह टैब django-admin.pyऔर manage.pyआदेशों को पूरा करने में सक्षम बनाता है , इसलिए आप उदाहरण के लिए ...

  • टाइप करें django-admin.py
  • सभी उपलब्ध विकल्पों को देखने के लिए [TAB] दबाएँ।
  • टाइप करें sql, फिर [TAB], सभी उपलब्ध विकल्पों को देखने के लिए जिनके नाम से शुरू होता है sql

1
यह मेरी अपेक्षा से अधिक उपयोगी है। धन्यवाद!
Jeeyoung Kim

यह नए उबंटू में डिफ़ॉल्ट रूप से कम से कम है। :-) मैं चकित था जब यह पहली बार कहीं से बाहर आया।
ओडिन्हो - वेलमॉन्ट

40

./manage.py runserver_plusFacilty जो के साथ आता है django_extensions वास्तव में भयानक है।

यह एक उन्नत डिबग पृष्ठ बनाता है, जो अन्य बातों के अलावा, स्टैक में प्रत्येक बिंदु के लिए इंटरैक्टिव डिबगिंग कंसोल बनाने के लिए Werkzeug डीबगर का उपयोग करता है (स्क्रीनशॉट देखें)। यह dump()एक वस्तु / फ्रेम के बारे में जानकारी प्रदर्शित करने के लिए एक बहुत ही उपयोगी सुविधा डिबगिंग विधि भी प्रदान करता है ।

यहां छवि विवरण दर्ज करें

स्थापित करने के लिए, आप पाइप का उपयोग कर सकते हैं:

pip install django_extensions
pip install Werkzeug

फिर 'django_extensions'अपने INSTALLED_APPStuple में जोड़ें settings.pyऔर नए एक्सटेंशन के साथ विकास सर्वर शुरू करें:

./manage.py runserver_plus

यह आपके डिबग करने के तरीके को बदल देगा।


37

मैं Django परियोजनाओं को डीबग करने के लिए पायथन डीबगर पीडीडी का उपयोग करना पसंद करता हूं।

यह कैसे उपयोग करने के लिए सीखने के लिए एक उपयोगी लिंक है: http://www.ferg.org/papers/debugging_in_python.html


13
यह एक देवता है। थोड़ी और जानकारी देने के लिए, अपने कोड की किसी भी लाइन पर इसे जोड़ें: "आयात pdb; pdb.set_trace ()"। अपने पृष्ठ को ताज़ा करें। यह लटक जाएगा। अब अपने टर्मिनल विंडो पर जाएं जहां आप विकास सर्वर चला रहे हैं। यह अब एक इंटरैक्टिव शेल होना चाहिए जहां आप सभी चर का उपयोग कर सकते हैं क्योंकि वे आपके कोड में उस बिंदु पर हैं जहां आपने डिबग कोड पेस्ट किया था।
6

37

जब Django और एक अन्य अनुप्रयोग के बीच डेटा का आदान-प्रदान करने की कोशिश कर रहा है, request.raw_post_dataएक अच्छा दोस्त है। XML डेटा प्राप्त करने और कस्टम-प्रोसेस करने के लिए इसका उपयोग करें।

प्रलेखन: http://docs.djangoproject.com/en/dev/ref/request-response/


5
ऐसे आप इसको करते हैं।
थैंक्यू

36

Django के साथ Jinja2 का उपयोग करें ।

अगर आपको Django टेम्प्लेट लैंग्वेज बेहद सीमित लगती है (मेरी तरह!) तो आपको इसके साथ अटकना नहीं है। Django लचीली है, और टेम्प्लेट लैंग्वेज बाकी सिस्टम से बहुत अच्छी तरह से जुड़ी हुई है, इसलिए सिर्फ दूसरी टेम्प्लेट लैंग्वेज में प्लग-इन करें और अपने http रिस्पॉन्स को रेंडर करने के लिए इसका इस्तेमाल करें!

मैं जिनजा 2 का उपयोग करता हूं , यह लगभग django टेम्पलेट भाषा के एक संचालित-अप संस्करण की तरह है, यह एक ही वाक्यविन्यास का उपयोग करता है, और यदि आप कथन में अभिव्यक्ति का उपयोग करने की अनुमति देते हैं! कोई और अधिक कस्टम बना रहा है जैसे कि टैग if_item_in_list! आप बस कह सकते हैं %{ if item in list %}, या {% if object.field < 10 %}

लेकिन वह सब नहीं है; टेम्प्लेट निर्माण को आसान बनाने के लिए कई और सुविधाएँ हैं, कि मैं उन सभी को यहाँ नहीं जा सकता।


मैं जिनजा 2 का भी उपयोग करता हूं और आनंद लेता हूं, लेकिन मैंने पाया है कि "कॉन्ट्रिब" ​​अनुप्रयोगों के लिए कुछ युग्मन हैं। विशेष रूप से, व्यवस्थापक उपकरण बहुत Django टेम्पलेट्स से बंधा हुआ है। इसके अलावा, मुझे कंट्रीब्यूट में लॉगिन डेकोरेटर्स को फिर से बनाना था।
जो होलोवे

24
टेम्पलेट सिस्टम को jinja2 से न बदलें, बस इसे "जोड़ें" करें, django templtes को न निकालें। अपने स्वयं के विचारों के लिए जिनजा 2 का उपयोग करें, और django टेम्पलेट भाषा का उपयोग करने के लिए व्यवस्थापक इंटरफ़ेस जारी रखें।
hasen

4
मैं इसके साथ हार्दिक सहमत हूं। Django के सीमित वाक्य-विन्यास ज्यादातर समय सहन करने योग्य होते हैं, लेकिन जब आप कस्टम टैग बनाने के बिंदु पर पहुंचते हैं और यह पता लगाते हैं कि वास्तव में कितना कठिन है, तो जिन्जा 2 ताजी हवा की एक सांस है
SingleNegationElimination

इसके अलावा, यदि आप टेम्पलेट स्रोत पर कोई मेटाप्रोग्रामिंग करना चाहते हैं, तो Jinja2 बहुत अधिक सुखद है, क्योंकि आप सीधे पार्स किए गए टेम्पलेट्स के एएसटी तक पहुंच सकते हैं। एएसटी घूमना यह पता लगाने जैसे कार्य करता है कि कौन से टेम्पलेट बेस टेम्पलेट का विस्तार करते हैं, या टेम्पलेट स्रोत ब्लॉक में अनबाउंड चर को सूचीबद्ध करते हैं, लगभग तुच्छ रूप से आसान।
17

5
Django 1.2 में शुक्र है कि IF टैग बहुत
छोटा है

35

assert Falseडिबग जानकारी डंप करने के लिए अपने दृश्य कोड में जोड़ें ।


4
मुझे लगता है कि
मुखर

13
यदि आप django dev सर्वर में अपना प्रोजेक्ट चला रहे हैं, तो अजगर के pdb मॉड्यूल का उपयोग करें। यह डिबग करने का एक बहुत अधिक शक्तिशाली तरीका है: आयात पीडीबी; pdb.stack_trace ()
mazelife

pdb बहुत उपयोगी है, जब तक आप डीबगिंग में बहुत तेज़ नहीं होते, तब तक आपके कनेक्शन का समय समाप्त होने की संभावना है।
स्टीफन पॉलगर

4
मैं हमेशा 5 / 0खुद का इस्तेमाल करता हूं। पांच क्यों? कोई जानकारी नहीं।
जेसनस्मिथ

@StephenPaulger वास्तव में? मेरा ब्राउज़र (फ़ायरफ़ॉक्स / डब्ल्यू फ़ायरबग) मुझे डिबग करते समय प्रतिक्रिया के लिए कई मिनट प्रतीक्षा करने के लिए सामग्री लगता है।
टीएम।

34

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

27

चूंकि 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),
)

2
FWIW, django के लेखक वास्तव में कुछ स्थानों में वर्ग-आधारित विचारों का उपयोग करते हैं, उदाहरण के लिए contrib.formtools: code.djangoproject.com/browser/django/trunk/django/contrib/…
mazelife

3
यदि आप एक कॉल विधि जोड़ते हैं तो आप RestfulResource नामक एक वर्ग बना सकते हैं और फिर आपके urls.py बिंदु को उदाहरण के लिए रख सकते हैं।
स्टीफन पॉलगर 10

1
नई (Django 1.3?) सामान्य विचार वर्ग आधारित हैं।
गोर्स्की

21

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

Django- कष्टप्रद में उपलब्ध @render_to डेकोरेटर का उपयोग करके और भी अधिक LOC सहेजें। bitbucket.org/offline/django-annoying
pithyless

6
.. या renderDjango 1.3 से नए शॉर्टकट विधि का उपयोग करें ( docs.djangoproject.com/en/dev/topics/http/shortcuts/#render )
gorsky

20

प्रश्न में टिप्पणी का जवाब देने के लिए मेरे पास पर्याप्त प्रतिष्ठा नहीं है, लेकिन यह ध्यान रखना महत्वपूर्ण है कि यदि आप जिन्जा का उपयोग करने जा रहे हैं , तो यह टेम्पलेट ब्लॉक नामों में '-' वर्ण का समर्थन नहीं करता है, जबकि Django करता है। इसने मुझे बहुत सारी समस्याएं पैदा कीं और समय की बर्बादी के कारण बहुत अस्पष्ट त्रुटि संदेश को उत्पन्न करने की कोशिश की।


एक नोट जो "जिन्जा से त्रुटि संदेश अस्पष्ट" के लिए लागू हो सकता है या नहीं हो सकता है। TEMPLATE_DEBUG सेट करना सुनिश्चित करें = सेटिंग में गलत। किसी कारण से यह आपको जिन्जा टेम्पलेट्स से सार्थक त्रुटियां देगा।
कार्ल जी

19

वेब डिज़ाइन एप्लिकेशन जब अपनी वेबसाइट डिजाइन करने के लिए शुरू करने के लिए बहुत उपयोगी है। एक बार आयात होने के बाद, आप इसे नमूना पाठ उत्पन्न करने के लिए जोड़ सकते हैं:

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

4
FYI करें, Django टेम्प्लेट के बजाय जिनजा 2 का उपयोग करने वाले किसी के लिए, आप कर सकते हैं: {{लिपसम (5)}}
जो होलोवे

19

django.db.models.get_model आपको किसी मॉडल को आयात किए बिना पुनर्प्राप्त करने की अनुमति देता है।

जेम्स दिखाता है कि यह कितना आसान हो सकता है: "Django युक्तियाँ: बेहतर टेम्पलेट टैग लिखें - Iteration 4"


अच्छा: ओ! और यहाँ मैं आलसी आयात कर रहा था जब भी मेरे पास परिपत्र निर्भरता थी।
फिलिप डुपनोविक

19

हर कोई जानता है कि एक ऐसा विकास सर्वर है जिसे आप "मैनेजमेडो रनसेवर" के साथ चला सकते हैं, लेकिन क्या आप जानते हैं कि स्थिर फ़ाइलों (सीएसएस / जेएस / आईएमजी) के लिए भी एक विकास दृश्य है?

नवागंतुकों को हमेशा हैरान किया जाता है क्योंकि 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/ पर उपलब्ध होगा।

बेशक, इसे उत्पादन वातावरण में उपयोग न करें।


6
मैं इसे देव मोड में उपयोग करता हूं, और यह सुनिश्चित करने के लिए कि मैं इसे उत्पादन में बंद करना नहीं भूलता, मैं उस URL नियम को DEBUG में केवल सशर्त लपेटता हूं।
sghael

18

मैंने इसे sorl-थंबनेल के प्रलेखन से सीखा है ऐप के । आप अपने टेम्प्लेट में कहीं और कॉल के परिणामों का उपयोग करने के लिए टेम्प्लेट टैग में "के रूप में" कीवर्ड का उपयोग कर सकते हैं।

उदाहरण के लिए:

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

यह Django templatetag प्रलेखन में पारित करने के लिए उल्लेख किया गया है, लेकिन केवल लूप के संदर्भ में। वे यह नहीं कहते हैं कि आप कहीं और (कहीं भी?) इसका उपयोग कर सकते हैं।


7
यदि "जैसे" के रूप में एक कीवर्ड का उपयोग टेम्पलेट-टैग के साथ किया जा सकता है, तो यह विशेष टैग पर निर्भर करता है। यह django द्वारा परिभाषित नहीं है, लेकिन एकल टैग द्वारा, उनके अर्थ पर निर्भर करता है। उल्लेखित url-
vikingosegundo

16

django.views.generic.list_detail.object_list - यह पेजिनेशन के लिए सभी लॉजिक और टेम्प्लेट वैरिएबल प्रदान करता है (उनमें से एक जो मैंने लिखा है-एक-हज़ार-अब-बार शराबी)। इसे लपेटकर आपको किसी भी तर्क की आवश्यकता होती है। इस रत्न ने मुझे मेरे "खोज परिणाम" पृष्ठों में ऑफ-बाय-वन त्रुटियों को डीबग करने के कई घंटे बचाए हैं और इस प्रक्रिया में व्यू कोड क्लीनर बनाता है।


1
आप djangobook.com/en/2.0/chapter11 पर सामान्य दृश्य पर पुस्तक के अध्याय का नया संस्करण पा सकते हैं । टिप्पणी पर एक पुस्तक के Django के पूर्व 1.0 संस्करण (Django पुस्तक 1.0) के लिए चला जाता है
Esteban Küber

16

PyCharm IDE कोड और विशेष रूप से डिबग के लिए एक अच्छा वातावरण है, जिसमें Django के लिए अंतर्निहित समर्थन है।


14

उपयोग 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'

यह रिश्तों और संग्रह को भी संभाल सकता है। हम इसका उपयोग हर दिन भारी उपयोग किए जाने वाले उत्पादन कोड में करते हैं, इसलिए बीटा के होने के बावजूद यह बहुत उपयोगी है। इसमें स्टब्स का एक अच्छा सेट भी है जिसे आप अपने परीक्षणों में उपयोग कर सकते हैं।

(अस्वीकरण: जबकि मैं इस पुस्तकालय का लेखक नहीं हूं, अब मैं एक कमिटेटर हूं, कुछ मामूली कमिट कर चुका हूं)


दिलचस्प परियोजना, इसे बनाए रखें!
सर्गेई गोलोवचेंको

धन्यवाद, यह बहुत आसान है :-)
Godswearhats

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.