2010-06-17 46 views
10

Vì vậy, tôi đang viết một trang web dựa trên Django cho phép người dùng chọn một bảng màu thông qua giao diện quản trị.Cách tạo CSS tùy chỉnh "khi đang di chuyển" dựa trên cài đặt tài khoản trong trang web Django?

Tôi đã có bộ xử lý trung gian/bối cảnh liên kết yêu cầu hiện tại (dựa trên miền) với tài khoản.

Câu hỏi của tôi là cách phân phối động CSS với lược đồ màu tùy chỉnh của tài khoản.

tôi thấy hai lựa chọn:

  1. Thêm một khối CSS để mẫu cơ sở đó sẽ ghi đè các phong cách w/biến thông qua vào thông qua một bộ vi xử lý ngữ cảnh.

  2. Sử dụng URL tùy chỉnh (ví dụ: "/ static/dynamic/css/< website_id> /styles.css") được định tuyến đến chế độ xem lấy tất cả các giá trị cần thiết và tạo tệp css.

Tôi có nội dung với một trong hai tùy chọn, nhưng tự hỏi liệu có ai khác đã giải quyết các vấn đề tương tự và có thể cung cấp một số thông tin chi tiết về "Thực tiễn tốt nhất" hay không.

Cập nhật: Tôi đang hướng tới tùy chọn số 2, vì tôi nghĩ điều này sẽ cho phép bộ nhớ đệm tốt hơn trên đường. Vì vậy, nó là năng động lần đầu tiên, được lưu trữ trong memcache (hoặc bất cứ điều gì), và vô hiệu khi người dùng cập nhật các thiết lập của họ trong trang quản trị.

Cập nhật: Trước hết, tôi muốn cảm ơn tất cả mọi người vì những đề xuất của họ cho đến nay. Tất cả các câu trả lời cho đến nay đã tập trung xung quanh việc tạo ra các tập tin tĩnh. Mặc dù điều này sẽ làm việc tuyệt vời trong sản xuất, nó cảm thấy giống như một gánh nặng to lớn trong quá trình phát triển. Nếu tôi muốn thêm một yếu tố mới để được tạo kiểu, hoặc tinh chỉnh các phong cách hiện có tôi sẽ phải đi qua và tạo lại mỗi và mọi tập tin css. Chắc chắn, điều này có thể được thực hiện với một lệnh quản lý, nhưng tôi không cảm thấy nó đáng giá. Làm nó tự động sẽ thêm 1 có thể 2 truy vấn cho mỗi lần tải trang, đó là điều mà tôi không lo lắng về giai đoạn này. Tất cả những gì tôi cần biết là tại một thời điểm nào đó tôi sẽ có thể lưu trữ nó mà không cần viết lại toàn bộ điều đó.

+1

có cần thiết không? tùy chỉnh có thể tạo tệp .css được lưu trữ cho mỗi người dùng và các trang có thể trỏ đến tệp .css đó – drfrogsplat

+1

@drfrogsplat: Cảm ơn nhận xét. Vấn đề với cách tiếp cận này trong tình huống của tôi là nếu tôi phải thêm một phong cách mới, tôi phải đi qua và xóa và tạo lại mọi tệp CSS duy nhất. – sdolan

Trả lời

2

Tôi đã sử dụng tùy chọn # 2 với thành công. Có 2 cách đàng hoàng của việc cập nhật các tập tin tĩnh tạo ra mà tôi biết:

  1. Sử dụng một phiên bản chuỗi truy vấn như /special_path.css?v=11452354234 nơi tham số v được tạo ra từ một lĩnh vực cơ sở dữ liệu, quan trọng trong memcached hoặc một số tệp liên tục khác. Phiên bản được quản trị viên cập nhật hoặc để phát triển, bạn sẽ chỉ làm cho thế hệ không lưu nếu thông số là thứ gì đó đặc biệt như v = -1. Bạn sẽ cần một quá trình để làm sạch các thế hệ cũ sau một thời gian.

  2. Không sử dụng chuỗi truy vấn phiên bản, nhưng trước tiên hãy sử dụng chuỗi tệp được tạo, nếu nó không thể tìm thấy, nó sẽ tạo ra nó. Bạn có thể tạo một công việc cron hoặc ứng dụng WSGI để tìm các thay đổi hệ thống tập tin để phát triển và có một móc từ bảng quản trị của bạn để xóa các thế hệ sau khi cập nhật. Dưới đây là một ví dụ về giám sát, mà bạn sẽ phải chuyển đổi để được cụ thể cho các thế hệ của bạn và không phải để Django. http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Monitoring%5FFor%5FCode%5FChanges

+0

Nhân tiện, tôi không khuyên bạn nên để màn hình chạy trong một ứng dụng sản xuất, chỉ cần rõ ràng. Đó sẽ là một kẻ giết người hiệu suất. – Jordan

+0

Cảm ơn, tôi sẽ đi với # 1 w/một số lời khuyên được đề cập bởi những người khác. – sdolan

+0

Bằng cách này, phương pháp này cho vay một cách độc đáo với cơ chế thay thế thay đổi, vì bạn sẽ xử lý các tệp .css bằng Python. Nếu đó không chỉ là CSS dạng tự do và bạn có danh sách thuộc tính đã biết, bạn có thể chuyển những tệp đó vào tệp css mẫu tự động thay thế bằng bất kỳ thứ gì trong cơ sở dữ liệu. Chúc may mắn! – Jordan

1

Câu hỏi hay.

Tôi khuyên bạn nên tạo trước tệp css sau khi sơ đồ màu được lưu. Điều này sẽ có tác động tích cực đến bộ nhớ đệm và thời gian tải trang tổng thể. Bạn có thể lưu trữ các file css của bạn trong thư mục /media/css/custom/<id or stometing>/styles.css hoặc /media/css/custom/<id or sth>.css và trong mẫu thêm <link rel="stylesheet" href="/media/css/custom/{{some_var_pointing _to_file_name}}" />

Bạn cũng có thể làm các trick với một số số ngẫu nhiên hoặc ngày trong tên tập tin css mà có thể được thay đổi mỗi lần tập tin được lưu. Nhờ trình duyệt này sẽ tải tệp ngay lập tức trong trường hợp thay đổi.

UPDATE: ví dụ của việc sử dụng mô hình để cải thiện ví dụ này Để thực hiện quản lý những tập tin dễ dàng, bạn có thể tạo mô hình đơn giản (một cho mỗi người dùng):

class UserCSS(models.Model): 
    bg_color = models.CharField(..) 
    ... 
    ... 

Fields (như bg_color) có thể đại diện cho các bộ phận của bạn tệp css. Bạn có thể ovveride save phương pháp để thêm logic tạo tệp css cho người dùng (bằng cách hiển thị một số mẫu).

Trong trường hợp thay đổi định dạng tệp, bạn có thể thực hiện các thay đổi trong định nghĩa mô hình của mình (với một số giá trị mặc định cho trường mới), thực hiện các thay đổi nhỏ trong mẫu và chạy phương thức lưu cho từng cá thể exisintg của lớp. Điều này sẽ làm mới các tệp css của bạn.

Điều đó sẽ hoạt động tốt.

1

Có thể tạo css và lưu trữ nó trong một trường văn bản trong cùng một kiểu như hồ sơ/cài đặt người dùng. Sau đó, có thể có chế độ xem để tạo lại chúng nếu bạn thay đổi kiểu. Sau đó, làm tùy chọn của bạn 1 ở trên.

1

Tôi sẽ tạo khóa md5 với các yếu tố chủ đề, lưu khóa này trong hồ sơ người dùng và tạo tệp ccs có tên sau khóa md5 này: bạn có quyền truy cập tệp tĩnh và phát hiện thay đổi chủ đề tự động.

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