Benim views.py
çok büyük oldu ve doğru görüşü bulmak zor.
Nasıl birkaç dosyaya bölerim ve sonra alabilirim? Herhangi bir hız kaybı içeriyor mu?
Ben de aynısını yapabilir miyim models.py
?
Benim views.py
çok büyük oldu ve doğru görüşü bulmak zor.
Nasıl birkaç dosyaya bölerim ve sonra alabilirim? Herhangi bir hız kaybı içeriyor mu?
Ben de aynısını yapabilir miyim models.py
?
Yanıtlar:
Django'da her şey bir Python modülüdür (* .py). İçinde bir görünüm klasörü oluşturabilirsiniz __init__.py
ve yine de görünümlerinizi içe aktarabilirsiniz, çünkü bu aynı zamanda bir Python modülü de uygular. Ama bir örnek daha iyi olurdu.
Orijinal views.py
belgeniz şöyle görünebilir:
def view1(arg):
pass
def view2(arg):
pass
Aşağıdaki klasör / dosya yapısıyla aynı şekilde çalışır:
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
Hızlı açıklama olacaktır: Eğer yazarken from views import view1
Python içinde view1 arayacaktır
views.py
, ilk (orijinal) durumda olan şey budur
views/__init__.py
, ikinci durumda olan budur. Burada, __init__.py
view1 yöntemini içe aktardığı için sağlayabilir.
Bu tür bir çözümle, içindeki argümanları değiştirmeye import
veyaurlpattern
urls.py
Her yeni görünüm dosyasında çok sayıda yönteminiz varsa, içe aktarma işlemlerini views/__init__.py
kullanımda yapmanın yararlı olduğunu görebilirsiniz *
, örneğin:
from viewsa import *
from viewsb import *
Aslında hız sorunlarını bilmiyorum (ama şüpheliyim).
Modeller için biraz zor olabilir.
__init__.py
: from myapp.views.viewsa import *
. Not artık bir views.py olamaz (veya en azından @ShiftNTab okumak olmayacak: Hata değil . views.py de sizin görüşlerinizi) bulma Umut yardımcı olur!
views.car.py
vsviews.cars.py
Bunu daha önce yapmak zorunda kaldım (netlik uğruna)
Bunu yaptığım yol, bir views
dizin oluşturmaktı , daha sonra,__init__.py
Şimdi, telefonunuzu ararken, urls.py
başka bir parça eklemeniz yeterlidir.
Örneğin, daha önce şunu aramış olabilirsiniz: -
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')
Artık bir şey diyebilirsiniz.
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')
Bu, elbette, views/year.py
işlevleri içerdiğini varsayarak index
ve user
;)
Temel olarak, kodunuzu istediğiniz yere koyabilirsiniz. İçe aktarma ifadelerini buna göre değiştirdiğinizden emin olun, örn urls.py
.
Gerçek kodunuzu bilmemek, anlamlı bir şey önermek zordur. Belki örn dosya adı öneki, bir çeşit kullanabilir views_helper.py
, views_fancy.py
, views_that_are_not_so_often_used.py
ya da öylesine ...
Başka bir seçenek de , tüm alt görünümleri içe aktardığınızviews
bir ile bir dizin oluşturmak olacaktır . Çok sayıda dosyaya ihtiyacınız varsa, görünümleriniz büyüdükçe daha iç içe alt görünümler oluşturabilirsiniz ...__init__.py
Sadece paylaşmak için Vincent Demeester'ın cevabı ile ilgili bazı sorunlar yaşadım. Her şey hariç cezası olan init'in .py dosyası, ben bu şekilde yazma vardır:
__init__.py :
from .viewsa import *
from .viewsb import *
Bu yolla import
urls.py dosyasındaki yöntemimi değiştirmem gerekmiyor. Ben duyuyorum Python 3.6.1 ve Django 1.11.4 .
Basit cevap: Evet.
En iyisi, views adında bir dizin oluşturmak ve daha sonra urls.py dosyasında yapmaktır:
import views
...
url(r'^classroom$', views.school.klass, name="classroom"),
Uygulamalarımdaki neredeyse tüm görünümleri bir görüntüleme klasörüne böldüm (elbette init .py ile). Ancak, bazı yanıtların önerdiği gibi init .py dosyasındaki tüm alt görünümleri içe aktarmıyorum . İyi çalışıyor gibi görünüyor.
Django sadece bir görünümün çağrılabilir bir nesne olmasını beklediğinden, PYTHONPATH'ınızda istediğiniz yere koyabilirsiniz. Böylece myapp.views adlı yeni bir paket oluşturabilir ve orada birden fazla modüle görünüm koyabilirsiniz. Doğal olarak urls.py ve bu görünüm hesaplarına referans veren diğer modülleri güncellemeniz gerekir.
Bunu init .py'ye koyarak oynamaktayım :
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))
Hala python için yeniyim, bu yüzden hala hız / güvenlik / kullanım kolaylığı üzerinde ne gibi etkilere bakıyorum.
Vincent Demeester'in cevabı mükemmel! ama benim için bağımlıların cevabı bir cazibe gibi çalıştı. Veritabanını taşımada zorluklarla karşılaştım . Hata, ilk modelin içe aktarıldığı satırı gösterir ve uygulama modülümü tanıyamayacağını söylüyor. Çok aradım ama bir çözüm bulamadım ama daha sonra modeli böyle içe aktardım:
from ..models import ModelName
İşe yaradı!!