मेरा views.py
बहुत बड़ा हो गया है और सही दृश्य खोजना कठिन है।
मैं इसे कई फ़ाइलों में कैसे विभाजित करूं और फिर इसे आयात करूं? क्या इसमें कोई स्पीड लॉस शामिल है?
क्या मैं भी ऐसा ही कर सकता हूं models.py
?
मेरा views.py
बहुत बड़ा हो गया है और सही दृश्य खोजना कठिन है।
मैं इसे कई फ़ाइलों में कैसे विभाजित करूं और फिर इसे आयात करूं? क्या इसमें कोई स्पीड लॉस शामिल है?
क्या मैं भी ऐसा ही कर सकता हूं models.py
?
जवाबों:
Django में सब कुछ एक पायथन मॉड्यूल (* .py) है। आप __init__.py
अंदर से एक दृश्य फ़ोल्डर बना सकते हैं और आप अभी भी अपने विचारों को आयात करने में सक्षम होंगे, क्योंकि यह एक पायथन मॉड्यूल को भी लागू करता है। लेकिन एक उदाहरण बेहतर होगा।
आपका मूल views.py
इस तरह दिख सकता है:
def view1(arg):
pass
def view2(arg):
pass
निम्नलिखित फ़ोल्डर / फ़ाइल संरचना के साथ यह समान काम करेगा:
views/
__init__.py
viewsa.py
viewsb.py
viewsa.py
:
def view1(arg):
pass
viewsb.py
:
def view2(arg):
pass
__init__.py
:
from viewsa import view1
from viewsb import view2
त्वरित विवरण होगा: जब आप लिखते हैं from views import view1
अजगर में View1 के लिए दिखेगा
views.py
, जो कि पहले (मूल) मामले में होता है
views/__init__.py
, जो दूसरे मामले में होता है। यहाँ, __init__.py
यह view1 विधि प्रदान करने में सक्षम है क्योंकि यह इसे आयात करता है।
इस तरह के समाधान से, आपको तर्क बदलने import
या urlpattern
बहस करने की कोई आवश्यकता नहीं होगीurls.py
यदि आपके पास प्रत्येक नई दृश्य फ़ाइल में कई विधियाँ हैं, तो आपको views/__init__.py
उपयोग में आयात करना उपयोगी लग सकता है *
, जैसे:
from viewsa import *
from viewsb import *
मैं वास्तव में गति के मुद्दों के बारे में नहीं जानता (लेकिन मुझे संदेह है कि कोई भी हो)।
मॉडल्स के लिए यह थोड़ा मुश्किल हो सकता है।
__init__.py
: from myapp.views.viewsa import *
ध्यान दें कि आपके पास अब एक भी थिंकपैड नहीं हो सकता है (या कम से कम इसे @ShiftNTab नहीं पढ़ा जाएगा: त्रुटि के लिए नहीं विचारों को अपने विचारों में बदलना)। आशा है कि यह मदद करता है!
views.car.py
बनामviews.cars.py
मुझे ऐसा पहले (स्पष्टता के लिए) करना पड़ा है
जिस तरह से मैंने ऐसा किया था वह एक views
निर्देशिका बनाने के लिए था , फिर, उसमें एक फ़ाइल बनाई गई जिसका नाम है__init__.py
अब, जब आप अपने में बुला रहे हैं urls.py
, तो आपको बस एक और हिस्सा जोड़ने की जरूरत है
उदाहरण के लिए, पहले, आप कह सकते हैं: -
url(r'^calendar/(?P<year>\d\d\d\d)/$', 'myproject.calendar.views.year')
url(r'^calendar/(?P<year>\d\d\d\d)/(?P<user>[a-z]+)/$', 'myproject.calendar.views.year_by_user')
अब आप कुछ की तर्ज पर कॉल कर सकते हैं
url(r'^calendar/(?P<year>\d\d\d\d)/$', 'myproject.calendar.views.year.index')
url(r'^calendar/(?P<year>\d\d\d\d)/(?P<user>[a-z]+)/$', 'myproject.calendar.views.year.user')
यह, निश्चित रूप से, यह मानते हुए कि आपके पास views/year.py
फ़ंक्शन हैं index
और user
;)
मूल रूप से, आप जहां चाहें, अपना कोड डाल सकते हैं। बस यह सुनिश्चित करें कि, आप अपने अनुसार आयात विवरण बदल सकते हैं, उदाहरण के लिए urls.py
।
अपने वास्तविक कोड को न जानकर कुछ सार्थक सुझाना कठिन है। हो सकता है आप फ़ाइल नाम उपसर्ग, जैसे किसी तरह का उपयोग कर सकते हैं views_helper.py
, views_fancy.py
, views_that_are_not_so_often_used.py
या तो ...
एक और विकल्प एक views
निर्देशिका बनाना होगा __init__.py
जिसमें आप सभी साक्षात्कारों को आयात करते हैं । यदि आपको बड़ी संख्या में फ़ाइलों की आवश्यकता है, तो आप अपने विचार बढ़ने के साथ और अधिक नेस्टेड साक्षात्कार बना सकते हैं ...
बस साझा करने के लिए, विंसेंट डेमेस्टर के जवाब के साथ मेरे पास कुछ मुद्दे थे। Init .py फ़ाइल को छोड़कर सबकुछ ठीक है , मुझे इस तरह से लिखना होगा:
__init__.py :
from .viewsa import *
from .viewsb import *
इस तरह मुझे अभी भी import
urls.py में अपना तरीका बदलने की ज़रूरत नहीं है। मैं Python 3.6.1 और Django 1.11.4 पर हूं ।
सरल उत्तर: हाँ।
सर्वश्रेष्ठ को एक निर्देशिका कहा जाता है जिसे दृश्य कहा जाता है और फिर अपने urls.py में करते हैं:
import views
...
url(r'^classroom$', views.school.klass, name="classroom"),
मैंने अपने ऐप्स में लगभग सभी दृश्यों को एक दृश्य फ़ोल्डर में विभाजित किया है ( निश्चित रूप से init .py के साथ )। हालाँकि, मैं init के सभी सबव्यूज़ को आयात नहीं करता हूँ । कुछ जवाब जैसे कुछ सुझाए गए हैं। यह ठीक काम करने लगता है।
चूंकि Django सिर्फ एक कॉल करने योग्य ऑब्जेक्ट होने की उम्मीद करता है, आप अपने PYTHONPATH में जहां चाहें वहां डाल सकते हैं। उदाहरण के लिए, आप सिर्फ एक नया पैकेज myapp.views बना सकते हैं और वहाँ कई मॉड्यूल में विचार रख सकते हैं। आपको स्वाभाविक रूप से अपने urls.py और अन्य मॉड्यूल को अपडेट करना होगा जो इन दृश्य कॉलबलों को संदर्भित करते हैं।
मैं इसे अपने init .py में डालने के साथ खेल रहा हूँ :
import os
currPath = os.path.realpath(os.path.dirname(__file__))
dirFiles = []
for root, dirs, files in os.walk(currPath):
for name in files:
if name.endswith('.py') and not name.startswith('_'):
dirFiles.append(name.strip('.py'))
for f in dirFiles:
exec("from %s import %s" % (f,f))
मैं अभी भी अजगर के लिए नया हूं, इसलिए मैं अभी भी देख रहा हूं कि गति / सुरक्षा / उपयोग में आसानी पर इसका क्या प्रभाव पड़ता है।
विन्सेन्ट डेमेस्टर का जवाब शानदार है! लेकिन मेरे लिए आदी के जवाब ने एक आकर्षण की तरह काम किया। मुझे डेटाबेस माइग्रेट करने में कठिनाइयों का सामना करना पड़ा । त्रुटि उस रेखा को इंगित करती है जहां पहला मॉडल आयात किया गया है और कहता है कि मेरे ऐप मॉड्यूल को पहचान नहीं सका। बहुत खोजा लेकिन समाधान नहीं मिला लेकिन बाद में मैंने मॉडल को इस तरह से आयात किया:
from ..models import ModelName
इसने काम कर दिया!!