ฉันviews.py
ใหญ่เกินไปและยากที่จะหามุมมองที่ถูกต้อง
ฉันจะแบ่งไฟล์เป็นหลาย ๆ ไฟล์แล้วนำเข้าได้อย่างไร มันเกี่ยวข้องกับการลดความเร็วหรือไม่?
ฉันสามารถทำเช่นเดียวกันกับmodels.py
?
ฉันviews.py
ใหญ่เกินไปและยากที่จะหามุมมองที่ถูกต้อง
ฉันจะแบ่งไฟล์เป็นหลาย ๆ ไฟล์แล้วนำเข้าได้อย่างไร มันเกี่ยวข้องกับการลดความเร็วหรือไม่?
ฉันสามารถทำเช่นเดียวกันกับmodels.py
?
คำตอบ:
ใน Django ทุกอย่างเป็นโมดูล Python (* .py) คุณสามารถสร้างโฟลเดอร์มุมมองพร้อมกับ__init__.py
ด้านในและคุณจะยังสามารถนำเข้ามุมมองของคุณเพราะมันยังใช้โมดูล Python แต่ตัวอย่างจะดีกว่า
ต้นฉบับของคุณ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 *
โปรดทราบว่าคุณไม่สามารถมี views.py ได้อีกต่อไป (หรืออย่างน้อยก็จะไม่สามารถอ่าน @ShiftNTab: ข้อผิดพลาดไม่ใช่ ค้นหามุมมองของคุณใน views.py) หวังว่ามันจะช่วยได้!
views.car.py
vsviews.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
ที่คุณนำเข้าทั้งหมดsubviews หากคุณต้องการไฟล์จำนวนมากคุณสามารถสร้างไฟล์ย่อยที่ซ้อนกันมากขึ้นเมื่อมุมมองของคุณเติบโต ...
เพียงเพื่อการแบ่งปันฉันมีปัญหาเล็กน้อยกับคำตอบของ Vincent Demeester ทุกอย่างเรียบร้อยยกเว้นในไฟล์init .py ฉันต้องเขียนด้วยวิธีนี้:
__init__.py :
from .viewsa import *
from .viewsb import *
วิธีนี้ฉันยังคงไม่จำเป็นต้องเปลี่ยนimport
วิธีการของฉันใน urls.py ฉันอยู่ในPython 3.6.1และDjango 1.11.4
คำตอบง่ายๆ: ใช่
ดีที่สุดคือการสร้างไดเรกทอรีที่เรียกว่า views จากนั้นใน urls.py ของคุณ:
import views
...
url(r'^classroom$', views.school.klass, name="classroom"),
ฉันแบ่งมุมมองเกือบทั้งหมดในแอพของฉันให้เป็นโฟลเดอร์มุมมอง ( แน่นอนว่าเป็นinit .py) อย่างไรก็ตามฉันไม่ได้นำเข้าการชมย่อยทั้งหมดในinit .py เช่นเดียวกับคำตอบที่แนะนำ ดูเหมือนว่าจะทำงานได้ดี
เนื่องจาก Django คาดหวังว่ามุมมองจะเป็นวัตถุที่เรียกได้คุณจึงสามารถใส่ได้ทุกที่ใน PYTHONPATH ของคุณ ดังนั้นคุณสามารถทำได้เช่นสร้างแพ็คเกจ myapp.views ใหม่และใส่มุมมองลงในหลาย ๆ โมดูล โดยปกติคุณจะต้องอัปเดต urls.py และโมดูลอื่น ๆ ที่อ้างอิง callables มุมมองเหล่านี้
ฉันได้เล่นโดยใส่สิ่งนี้ลงใน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))
ฉันยังใหม่กับงูใหญ่ดังนั้นฉันยังคงดูว่ามันมีผลต่อความเร็ว / ความปลอดภัย / ความง่ายในการใช้งานอย่างไร
สมมติว่าคุณมีไฟล์ชื่อ: password_generator.py
แล้วviews.py
เพิ่มภายใน:from password_generator import *
จากนั้นคุณสามารถเรียกใช้ฟังก์ชันของโมดูลviews.py
นั้นได้
คำตอบของVincent Demeesterนั้นยอดเยี่ยมมาก! แต่สำหรับฉันคำตอบที่ติดได้ทำงานเหมือนจับใจ ฉันประสบปัญหาในการย้ายฐานข้อมูล ข้อผิดพลาดระบุบรรทัดที่นำเข้าโมเดลแรกและแจ้งว่าไม่รู้จักโมดูลแอปของฉัน ค้นหามาก แต่ไม่พบวิธีแก้ปัญหา แต่ต่อมาฉันนำเข้าโมเดลเช่นนี้:
from ..models import ModelName
มันได้ผล !!