2011-03-22 38 views
16

Tôi không biết nếu im rõ ràng với quiestion tiêu đề, những gì tôi muốn làm là trường hợp tiếp theo:loại nội dung django - cách lấy loại mô hình loại nội dung để tạo một phiên bản?

>>> from django.contrib.contenttypes.models import ContentType 
>>> ct = ContentType.objects.get(model='user') 
>>> ct.model_class() 
<class 'django.contrib.auth.models.User'> 
>>> ct_class = ct.model_class() 
>>> ct_class.username = 'hellow' 
>>> ct_class.save() 
TypeError: unbound method save() must be called with User instance as first argument  (got nothing instead) 

Tôi chỉ muốn nhanh chóng bất kỳ mô hình mà tôi có được qua các loại nội dung. Sau đó tôi cần phải làm một cái gì đó như form = create_form_from_model(ct_class) và nhận mẫu biểu mẫu này sẵn sàng để sử dụng.

Cảm ơn bạn trước !.

Trả lời

30

Bạn cần tạo một phiên bản của lớp. ct.model_class() trả về lớp học, không phải là một thể hiện của nó. Hãy thử như sau:

>>> from django.contrib.contenttypes.models import ContentType 
>>> ct = ContentType.objects.get(model='user') 
>>> ct_class = ct.model_class() 
>>> ct_instance = ct_class() 
>>> ct_instance.username = 'hellow' 
>>> ct_instance.save() 
+0

mát !, và nếu tôi muốn làm cho queryset: ct_instance .__ lớp __ objects.all() - với điều này tôi có thể sử dụng các nhà máy formset để tạo ra các hình thức năng động của. tất cả các trường hợp tôi cần. cảm ơn! – panchicore

+0

Bạn cũng có thể nhận được queryset trực tiếp từ lớp - 'ct_class.objects.all()'. – Blair

5

iPython hoặc tự động hoàn thành là người bạn tốt nhất của bạn. Vấn đề của bạn chỉ là bạn đang gọi lưu trên Model chính nó. Bạn cần phải gọi lưu trên một thể hiện.

ContentType.objects.latest('id').model_class() 

some_ctype_model_instance = some_ctype.model_class()() 
some_ctype_model_instance.user = user 
some_ctype_model_instance.save() 

some_instance = some_ctype.model_class().create(...) 
+1

+1 để được tư vấn ipython – panchicore

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