कई फ़ाइलों में स्प्लिट्सहोम को विभाजित करें


153

मेरा views.pyबहुत बड़ा हो गया है और सही दृश्य खोजना कठिन है।

मैं इसे कई फ़ाइलों में कैसे विभाजित करूं और फिर इसे आयात करूं? क्या इसमें कोई स्पीड लॉस शामिल है?

क्या मैं भी ऐसा ही कर सकता हूं models.py?


4
मैंने अपनी बड़ी (7k पंक्तियों) व्यूहोम फ़ाइल को अलग-अलग फ़ाइलों में विभाजित किया और गति में वृद्धि महत्वपूर्ण थी।
user1261774

जवाबों:


190

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 के लिए दिखेगा

  1. views.py, जो कि पहले (मूल) मामले में होता है

  2. views/__init__.py, जो दूसरे मामले में होता है। यहाँ, __init__.pyयह view1 विधि प्रदान करने में सक्षम है क्योंकि यह इसे आयात करता है।

इस तरह के समाधान से, आपको तर्क बदलने importया urlpatternबहस करने की कोई आवश्यकता नहीं होगीurls.py

यदि आपके पास प्रत्येक नई दृश्य फ़ाइल में कई विधियाँ हैं, तो आपको views/__init__.pyउपयोग में आयात करना उपयोगी लग सकता है *, जैसे:

from viewsa import *
from viewsb import *

मैं वास्तव में गति के मुद्दों के बारे में नहीं जानता (लेकिन मुझे संदेह है कि कोई भी हो)।

मॉडल्स के लिए यह थोड़ा मुश्किल हो सकता है।


2
क्या आप कृपया एक url पैटर्न जोड़ सकते हैं जो आपके उदाहरण में view1 या view2 से मेल खाता है? क्योंकि मैं उस के साथ समस्या कर रहा हूँ ....
पास्कल क्लेन

2
मैंने ऐसा करने की कोशिश की, लेकिन जब मैं अपने मॉडल आयात करने के लिए जाता हूं (app.models से आयात करें MyModel या मॉडल आयात MyModel से) पायथन शिकायत करता है कि मॉडल मौजूद नहीं है।
क्रिस मिलर

यदि हम रूट डायरेक्टरी में view.pyों को हटा दें तो यह ठीक है?
रोएल

6
यह समाधान मेरे लिए काम नहीं करता है (@ChrisMiller की तुलना में एक ही त्रुटि है। मेरा समाधान: इसमें __init__.py: from myapp.views.viewsa import *ध्यान दें कि आपके पास अब एक भी थिंकपैड नहीं हो सकता है (या कम से कम इसे @ShiftNTab नहीं पढ़ा जाएगा: त्रुटि के लिए नहीं विचारों को अपने विचारों में बदलना)। आशा है कि यह मदद करता है!
ThePhi

नामकरण सम्मेलन के बारे में क्या: फ़ाइल का नाम एकवचन या बहुवचन होना चाहिए? जैसे: views.car.pyबनामviews.cars.py
प्रतिद्वंद्वी

21

मुझे ऐसा पहले (स्पष्टता के लिए) करना पड़ा है

जिस तरह से मैंने ऐसा किया था वह एक 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;)


10

मूल रूप से, आप जहां चाहें, अपना कोड डाल सकते हैं। बस यह सुनिश्चित करें कि, आप अपने अनुसार आयात विवरण बदल सकते हैं, उदाहरण के लिए urls.py

अपने वास्तविक कोड को न जानकर कुछ सार्थक सुझाना कठिन है। हो सकता है आप फ़ाइल नाम उपसर्ग, जैसे किसी तरह का उपयोग कर सकते हैं views_helper.py, views_fancy.py, views_that_are_not_so_often_used.pyया तो ...

एक और विकल्प एक viewsनिर्देशिका बनाना होगा __init__.pyजिसमें आप सभी साक्षात्कारों को आयात करते हैं । यदि आपको बड़ी संख्या में फ़ाइलों की आवश्यकता है, तो आप अपने विचार बढ़ने के साथ और अधिक नेस्टेड साक्षात्कार बना सकते हैं ...


8

बस साझा करने के लिए, विंसेंट डेमेस्टर के जवाब के साथ मेरे पास कुछ मुद्दे थे। Init .py फ़ाइल को छोड़कर सबकुछ ठीक है , मुझे इस तरह से लिखना होगा:

__init__.py :

from .viewsa import *
from .viewsb import *

इस तरह मुझे अभी भी importurls.py में अपना तरीका बदलने की ज़रूरत नहीं है। मैं Python 3.6.1 और Django 1.11.4 पर हूं ।


5

सरल उत्तर: हाँ।

सर्वश्रेष्ठ को एक निर्देशिका कहा जाता है जिसे दृश्य कहा जाता है और फिर अपने urls.py में करते हैं:

import views
...
url(r'^classroom$', views.school.klass, name="classroom"),

1

मैंने अपने ऐप्स में लगभग सभी दृश्यों को एक दृश्य फ़ोल्डर में विभाजित किया है ( निश्चित रूप से init .py के साथ )। हालाँकि, मैं init के सभी सबव्यूज़ को आयात नहीं करता हूँ । कुछ जवाब जैसे कुछ सुझाए गए हैं। यह ठीक काम करने लगता है।


1

चूंकि Django सिर्फ एक कॉल करने योग्य ऑब्जेक्ट होने की उम्मीद करता है, आप अपने PYTHONPATH में जहां चाहें वहां डाल सकते हैं। उदाहरण के लिए, आप सिर्फ एक नया पैकेज myapp.views बना सकते हैं और वहाँ कई मॉड्यूल में विचार रख सकते हैं। आपको स्वाभाविक रूप से अपने urls.py और अन्य मॉड्यूल को अपडेट करना होगा जो इन दृश्य कॉलबलों को संदर्भित करते हैं।


1
यह वास्तव में गलत है - यह मॉडल के साथ किया जा सकता है। देखें: code.djangoproject.com/ticket/4470
जोनाथन बर्जर

1
आह, यह जानकर अच्छा लगा, धन्यवाद :-) मैंने हमेशा सोचा था कि मॉडल के साथ थोड़ा और जादू था और वे ऐप पैकेज में कैसे रहते हैं। मेरी प्रतिक्रिया में मॉडल के बारे में लाइन हटा दी।
होर्स्ट गुटमैन

खुशी है कि मैं मदद कर सकता हूं, मुझे बाद में एहसास हुआ कि यह लिंक वास्तव में बताता है कि यह मॉडल के साथ कितना बेहतर है: blog.amber.org/2009/01/19/…
जोनाथन बर्जर

1

मैं इसे अपने 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))

मैं अभी भी अजगर के लिए नया हूं, इसलिए मैं अभी भी देख रहा हूं कि गति / सुरक्षा / उपयोग में आसानी पर इसका क्या प्रभाव पड़ता है।


1

मान लीजिए अगर आपके पास कोई फ़ाइल है: password_generator.pyतो अंदर views.pyजोड़ें:from password_generator import *

तब आप उस मॉड्यूल के फ़ंक्शन को कॉल कर सकते हैं views.py


1

विन्सेन्ट डेमेस्टर का जवाब शानदार है! लेकिन मेरे लिए आदी के जवाब ने एक आकर्षण की तरह काम किया। मुझे डेटाबेस माइग्रेट करने में कठिनाइयों का सामना करना पड़ा । त्रुटि उस रेखा को इंगित करती है जहां पहला मॉडल आयात किया गया है और कहता है कि मेरे ऐप मॉड्यूल को पहचान नहीं सका। बहुत खोजा लेकिन समाधान नहीं मिला लेकिन बाद में मैंने मॉडल को इस तरह से आयात किया:

from ..models import ModelName

इसने काम कर दिया!!

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