বেশ কয়েকটি ফাইলে ভিউ.পি স্প্লিট করুন


153

আমার views.pyখুব বড় হয়ে গেছে এবং সঠিক দর্শন পাওয়া শক্ত।

আমি কীভাবে এটি বেশ কয়েকটি ফাইলে বিভক্ত করব এবং তারপরে এটি আমদানি করব? এটি কোন গতি ক্ষতি জড়িত?

আমি কি একই সাথে করতে পারি models.py?


4
আমি আমার বৃহত (7 কে লাইন) ভিউ.পি ফাইলকে পৃথক পৃথক ফাইলগুলিতে বিভক্ত করেছি এবং গতির বৃদ্ধি উল্লেখযোগ্য ছিল।
ব্যবহারকারী 1261774

উত্তর:


190

জাজানোতে সমস্ত কিছুই পাইথন মডিউল (* .পি)। আপনি একটি __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ভিউ 1 পদ্ধতি সরবরাহ করতে সক্ষম কারণ এটি এটি আমদানি করে।

এই ধরণের সমাধান সহ আপনার কোনও যুক্তি importবা পরিবর্তন করার দরকার নেইurlpatternurls.py

আপনার যদি প্রতিটি নতুন ভিউ ফাইলে অনেকগুলি পদ্ধতি থাকে তবে আপনি আমদানিগুলি views/__init__.pyব্যবহারে এটি দরকারী হিসাবে দেখতে পারেন *:

from viewsa import *
from viewsb import *

আমি আসলে গতির সমস্যাগুলি সম্পর্কে জানি না (তবে আমি সন্দেহ করি যে এর কোনও আছে)।

মডেলদের জন্য এটি কিছুটা কঠিন হতে পারে।


2
আপনি কি দয়া করে কোনও url প্যাটার্ন যুক্ত করতে পারেন যা আপনার উদাহরণে ভিউ 1 বা ভিউ 2 এর সাথে মেলে? কারন আমার সাথে সমস্যা হচ্ছে ....
পাস্কেল ক্লেইন

2
আমি এটি করার চেষ্টা করেছি, তবে আমি যখন আমার মডেলগুলি আমদানি করতে যাই (অ্যাপ্লিকেশনগুলি থেকে মডেলগুলি মাইমোডেল আমদানি করে বা মডেলগুলি মাইমোডেল আমদানি করে) পাইথন অভিযোগ করেন যে মডেলটির অস্তিত্ব নেই।
ক্রিস মিলার

যদি আমরা রুট ডিরেক্টরিতে ভিউ.পিটি মুছে ফেলি তবে ঠিক আছে?
রোল

6
এই সমাধানটি আমার পক্ষে কাজ করে না (@ ক্রিসমিলারের চেয়ে একই ত্রুটি My আমার সমাধান: ইন __init__.py: from myapp.views.viewsa import *that দ্রষ্টব্য নোট করুন যে আপনার আর একটি ভিউ.পি থাকতে পারে না (বা কমপক্ষে এটি @ShiftNTab পড়তে হবে না: ত্রুটি নয় ভিউ.পি-তে আপনার মতামত সন্ধান করুন) আশা করি এটি সাহায্য করবে!
থিফি

নামকরণ কনভেনশন সম্পর্কে কী: ফাইলের নামটি একক বা বহুবচন হওয়া উচিত? উদাহরণস্বরূপ: 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. এ আমার পদ্ধতি পরিবর্তন করার দরকার নেই। আমি পাইথন 3.6.1 এবং জ্যাঙ্গো 1.11.4 এ আছি


5

সহজ উত্তর: হ্যাঁ

ভিউ নামে পরিচিত একটি ডিরেক্টরি তৈরি করা এবং তারপরে আপনার url.py do:

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

1

আমি (একটি সঙ্গে ফোল্ডারের একটি মতামত আমার অ্যাপ্লিকেশানে প্রায় সকল দৃশ্য বিভক্ত Init অবশ্যই .py)। আমি অবশ্য subviews সব আমদানি না Init .py অনেক বিষয়ে উত্তর কিছু পরামর্শ দিয়েছেন। মনে হচ্ছে ঠিক কাজ করছে।


1

যেহেতু জ্যাঙ্গো কেবল একটি দৃশ্যকে কলযোগ্য বস্তু হিসাবে প্রত্যাশা করেছে, তাই আপনি আপনার পাইথনপথে যেখানেই পছন্দ করতে পারেন। সুতরাং আপনি উদাহরণস্বরূপ কেবল একটি নতুন প্যাকেজ myapp.views তৈরি করতে এবং সেখানে একাধিক মডিউলগুলিতে ভিউগুলি রাখতে পারেন। আপনাকে স্বাভাবিকভাবেই আপনার ইউআরএল.পি এবং অন্যান্য মডিউলগুলি আপডেট করতে হবে যা এই দৃশ্যের কলযোগ্যদের উল্লেখ করে।


1
এটি আসলে ভুল - এটি মডেলগুলি দিয়ে করা যেতে পারে। দেখুন: কোড. djangoproject.com/ticket/4470
জোনাথন বার্গার

1
আহ, জেনে রাখা ভাল, আপনাকে ধন্যবাদ :-) আমি সর্বদা ভাবতাম মডেলগুলির সাথে আরও কিছু জাদু জড়িত রয়েছে এবং তারা অ্যাপ প্যাকেজে কীভাবে বাস করে। আমার প্রতিক্রিয়াতে মডেলগুলি সম্পর্কে লাইনটি সরিয়েছে।
হোর্স্ট গুটম্যান

আমি খুশী হয়ে সাহায্য করতে পারি, আমি বুঝতে পেরেছিলাম যে এই লিঙ্কটি আসলে এটি আরও ভালভাবে মডেলগুলির সাথে কীভাবে করা হয়েছে তা ব্যাখ্যা করে: ব্লগ.আমবার.আর.অর্গ
জোনাথন বার্গার

1

আমি আমার init এ এটি স্থাপন করে খেলছি। পিপি:

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

এটা কাজ করেছে!!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.