2012-07-11 56 views
6

Tôi đang làm việc trên một số biểu mẫu ở Django. Một trường là ForeignKey trong mô hình, do đó được biểu diễn dưới dạng ModelChoiceField trong biểu mẫu. ModelChoiceField hiện đang sử dụng phương thức __unicode__ của mô hình để điền danh sách, đó không phải là hành vi mong muốn của tôi. Tôi muốn có thể sử dụng một phương pháp khác của mô hình. Từ tài liệu, có vẻ như tôi có thể ép buộc số QuerySet của riêng mình, nhưng tôi không thể thấy cách thức này sẽ giúp tôi sử dụng phương thức khác với __unicode__.Sử dụng phương pháp khác ngoài __unicode__ trong ModelChoiceField Django

Tôi thực sự muốn tránh ly dị việc này khỏi các phương thức biểu mẫu mặc định nếu có thể.

Mọi đề xuất?

Trả lời

1

Không quá nhiều truy vấn tùy chỉnh, nhưng chuyển đổi bộ truy vấn của bạn thành danh sách. Nếu bạn chỉ làm choices=some_queryset Django làm cho sự lựa chọn theo hình thức:

(item.pk, item.__unicode__()) 

Vì vậy, chỉ làm điều đó cho mình với một sự hiểu biết danh sách:

choices=[(item.pk, item.some_other_method()) for item in some_queryset] 
+0

Cảm ơn. Thực sự tiện dụng. – TimD

10

Bạn có thể ghi đè lên label_from_instance để xác định một phương pháp khác nhau:

from django.forms.models import ModelChoiceField 

class MyModelChoiceField(ModelChoiceField): 

    def label_from_instance(self, obj): 
     return obj.my_custom_method() 

Sau đó, bạn có thể sử dụng trường này trong biểu mẫu của mình. Phương pháp này được dự định sẽ được ghi đè trong các lớp con. Đây là nguồn gốc trong số django.forms.models:

# this method will be used to create object labels by the QuerySetIterator. 
# Override it to customize the label. 
def label_from_instance(self, obj): 
    """ 
    This method is used to convert objects into strings; it's used to 
    generate the labels for the choices presented by this object. Subclasses 
    can override this method to customize the display of the choices. 
    """ 
    return smart_unicode(obj) 
Các vấn đề liên quan