2010-03-05 30 views
5

Có cách nào dễ dàng để làm như vậy không?Đặt thuộc tính lựa chọn trường mô hình tại thời gian chạy?

+0

Vì sự tò mò, trường hợp sử dụng của bạn cho điều này là gì? –

+0

Tôi đang cố kéo danh sách lựa chọn từ cơ sở dữ liệu. Tôi cũng đang sử dụng bản dịch và tôi không thể gắn thẻ chuỗi để dịch vì chúng nằm trong cơ sở dữ liệu. –

+0

Những lựa chọn này có được tiếp xúc với người dùng hoặc chỉ được sử dụng cho logic nội bộ không? Tôi tự hỏi nếu đây là một cái gì đó có thể được xử lý ở cấp độ hình thức vì nó là phổ biến hơn nhiều để tự động xây dựng các lựa chọn đó. Thay đổi các lựa chọn ở cấp mô hình dường như đánh bại mục đích thiết lập các lựa chọn trên mô hình ngay từ đầu. Có lẽ điều này có thể được tiếp cận theo một cách khác? –

Trả lời

2

Bạn có thể thiết lập các lựa chọn thuộc tính cho bất kỳ iterable: http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.Field.choices

tôi đã không kiểm tra này bản thân mình vì vậy tôi không chắc chắn khi lựa chọn thuộc tính được đánh giá thực tế, nhưng bạn có thể gán một máy phát điện chức năng sẽ tính toán các lựa chọn mong muốn của bạn.

Bạn cũng có thể điều tra bằng cách sử dụng tín hiệu mẫu post_init: http://docs.djangoproject.com/en/1.1/ref/signals/#post-init

này sẽ cung cấp cho bạn truy cập vào mô hình của bạn sau Django đã khởi tạo nó và do đó bạn có thể thiết lập các lựa chọn tại thời điểm đó. Bạn có thể muốn xem qua giao diện "_meta" như sau:

instance._meta.get_field_by_name('FIELD_NAME')[0].choices = [<choices>...] 
+0

Điều đó gần như đã hiệu quả. Tôi có thể thấy các lựa chọn hiện tại, nhưng nếu tôi cố gắng đặt nó thành một giá trị khác, tôi nhận được lỗi: AttributeError: không thể thiết lập thuộc tính. –

+1

Poking xung quanh trong các lĩnh vực nguồn, bạn có thể thấy rằng "lựa chọn" là một tài sản chỉ đọc: http://code.djangoproject.com/browser/django/tags/releases/1.1.1/django/db/models /fields/__init__.py#L296 Thay vào đó hãy thử đặt thành "_choices". Điều này làm việc trong vỏ nhưng tôi sẽ không thực hiện bất kỳ đảm bảo về hậu quả ngoài ý muốn. –

+0

CÓ! Nó ổn với tôi. Cảm ơn nhiều. –

1

Đặt các lựa chọn in __init__().

+0

Tôi xin lỗi, tôi không rõ ràng. Tôi có nghĩa là thiết lập/thay đổi thuộc tính lựa chọn sau khi một mô hình đã được khởi tạo. –

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