2010-04-11 26 views
18

Tôi đang phát triển một ứng dụng Django, một hệ thống lớn yêu cầu nhiều ứng dụng phụ để giữ mọi thứ gọn gàng. Vì vậy, tôi có một thư mục cấp cao nhất mà là một ứng dụng Django (vì nó có một tập tin rỗng models.py), và nhiều thư mục con, cũng là ứng dụng trong chính chúng.Tiểu sử và cấu trúc mô-đun Django

Lý do tôi đã đặt đơn đăng ký của mình theo cách này là do các ứng dụng con được tách riêng, nhưng chúng sẽ không bao giờ được sử dụng riêng, bên ngoài ứng dụng gốc. Do đó, không phân biệt chúng một cách riêng biệt.

Khi cài đặt ứng dụng của tôi, các tập tin cài đặt có bao gồm một cái gì đó như thế này:

INSTALLED_APPS = (
    ... 
    'myapp', 
    'myapp.subapp1', 
    'myapp.subapp2', 
    ... 
) 

... mà rõ ràng là tối ưu. Điều này cũng có kết quả hơi khó chịu khi yêu cầu tất cả các ứng dụng con được gọi bằng tên "bên trong" của chúng (ví dụ: subapp1, subapp2, v.v.). Ví dụ, nếu tôi muốn thiết lập lại các bảng cơ sở dữ liệu cho subapp1, tôi phải gõ:

python manage.py reset subapp1 

Đây là khó chịu, đặc biệt là bởi vì tôi có một tiểu ứng dụng gọi core - đó là khả năng xung đột với tên của ứng dụng khác khi ứng dụng của tôi được cài đặt trong dự án của người dùng.

Tôi có thực hiện điều này một cách hoàn toàn sai hay không, để đưa các ứng dụng "bên trong" này được gọi bằng tên đầy đủ của chúng?

+0

Tại sao điều này phụ tối ưu cho bạn? Bạn có thể làm rõ những gì bạn muốn đạt được? –

+0

Đơn giản chỉ vì, để cài đặt "ứng dụng" của tôi, mọi ứng dụng trong mô-đun chính là bắt buộc, do đó, nó trùng lặp dữ liệu thực sự. Ngoài ra, nếu chúng tôi thêm bất kỳ ứng dụng con nào, chúng phải được thêm vào danh sách các ứng dụng đã cài đặt trên mọi cài đặt. –

Trả lời

12

Bạn đang làm đúng cách, vì bản thân django cũng làm như vậy. Ví dụ: ứng dụng quản trị được đăng ký trong INSTALLED_APPSdjango.contrib.admin, nhưng để đặt lại, bạn phải sử dụng manage.py reset admin và thực sự, manage.py reset django.contrib.adminkhông hoạt động.

Nó có thể được coi là một lỗi trong django ...

Tuy nhiên, bạn không nên lo lắng bởi các cuộc xung đột tên, bởi vì bạn nên luôn luôn chạy django bên trong một môi trường virtualenv, bị cô lập với phần còn lại của cài đặt python. Đây là một giải pháp cực kỳ mạnh mẽ và linh hoạt hơn chạy django trên một cài đặt python bình thường. Thông tin thêm, ví dụ: tại đây: http://mathematism.com/2009/jul/30/presentation-pip-and-virtualenv/

+1

Tôi đã sử dụng virtualenv, nhưng điều này không giải quyết được vấn đề - vì người dùng thực sự có khả năng tạo ứng dụng được gọi là 'core' trong dự án của họ, sau đó sẽ xung đột với ứng dụng' core' của tôi. –

+0

Chắc chắn, đây là một hạn chế. Tôi đã gửi một bản vá: http://code.djangoproject.com/attachment/ticket/13323/applabel.diff Xem thêm vé tương ứng. Tuy nhiên, tôi không chắc vấn đề này có được giải quyết hoàn toàn hay không. –

+0

Tôi không biết điều này đã được thảo luận, cảm ơn. Vé # 3591 trông có vẻ hứa hẹn nhất, nhưng nó không nằm trong danh sách cho 1.2 vì vậy tôi đoán tôi sẽ chỉ phải làm việc quanh vấn đề cho đến khi có điều gì đó xảy ra. Tôi không ưa thích chạy một cài đặt tùy chỉnh của Django cho dự án này :). –

Các vấn đề liên quan