2011-09-15 20 views

Trả lời

10

Bạn không thể truy cập trực tiếp verbose_name từ mẫu. Từ những gì tôi thấy bạn có ba lựa chọn.

Tùy chọn một (đơn giản nhất). Gán tên tiết trong điều khiển của bạn và sau đó truy cập nó từ mẫu:

# in controller 
render_to_response('template.html', {'scrib_verbose_name': Scrib._meta.verbose_name}) 

# in a view template.html 
Verbose name of a Scrib model: {{ scrib_verbose_name }} 

Lựa chọn hai: viết cho mình một helper điểm cho rằng sẽ trả lại verbose_name (hoặc lĩnh vực khác từ lớp _meta) cho một lớp nhất định.

Cập nhật Tùy chọn thứ ba (mẹo để Uku Loskit) - xác định phương thức trên mô hình scrib trả về đối tượng meta (hoặc bất kỳ trường cụ thể nào từ nó).

# method in a Scrib model 
def meta(self): 
    return self._meta 

# later on in a template - scrib is a instance of Scrib model 
<h1>{{ scrib.meta.verbose_name }}</h1> 

Update2 Nếu bạn nhấn mạnh vào trực tiếp truy cập vào tên verbose từ scribs (mà là một kết quả của Scrib.objects.all()), sau đó bạn có thể làm những thứ như:

scribs = Scrib.objects.all() 
scribs.verbose_name = Scrib._meta.verbose_name 

# in a template you can now access verbose name from a scribs variable 
{{ scribs.verbose_name }} 

UPDATE3 Tuy nhiên, một cách khác để đi là sử dụng mô hình inhertinace để có thể truy cập tên tiết từ ví dụ của bất kỳ mô hình nào được kế thừa từ mô hình tùy chỉnh của chúng tôi.

# base model (inherits from models.Model) 
class CustomModel(models.Model): 
    def meta(self): 
     return self._meta 

    class Meta: 
     abstract = True 

# Scrib now inherit from CustomModel 
class Scrib(CustomModel): 
    # do any stuff you want here ... 

Scrib nay kế thừa từ CustomModel đó cho chúng ta sở hữu meta. Bất kỳ mô hình nào sẽ kế thừa từ lớp CustomModel sẽ có thuộc tính này. Đó là giải pháp sạch và linh hoạt nhất.

+0

trên thực tế 'scribs' là t bình đẳng o 'Scrib.objects.all()' vì vậy nó là một đối tượng đa. Tôi có phải đặt 'Scrib' thay vì' Scrib.objects.all() 'vào 'scribs'? –

+0

Vâng, nếu bạn lặp lại mẫu của bạn thông qua các bản ghi chép thì bạn có thể sử dụng '.meta.verbose_name' trên mọi thể hiện của bản ghi chép trong một vòng lặp. Nếu bạn muốn hiển thị nó chỉ một lần (trước khi thực tế looping ví dụ), bạn có thể làm chỉ đơn giản là '{{scribs.0.meta.verbose_name}}' để hiển thị một tên tiết bằng cách sử dụng scribs đầu tiên trong một mảng scribs. – WTK

+0

Tôi không thể trực tiếp đưa mô hình 'Scrib' vào 'scribs', lặp lại' scribs.objects.all' và sử dụng' scribs.verbose_name' hoặc một cái gì đó đơn giản hơn? Nếu không, tôi sẽ phải đặt chức năng này trên tất cả các mô hình của tôi? –

5

Ngoài ra để gợi ý WTK của bạn có thể xác định một phương pháp cho mô hình Scrib trong models.py của bạn như thế này:

def get_verbose_name(self): 
    return self._meta.verbose_name 
# in templates 
{{ scrib_instance.get_verbose_name }} 
+0

Tôi có phải tạo phương pháp này cho tất cả các đối tượng mà tôi cần tên tiết hoặc có cách đơn giản hơn không? –

+1

@PierredeLESPINAY Bạn có thể có một mô hình trừu tượng cơ bản và có tất cả các mô hình của bạn mở rộng từ nó. Viết một lần, sử dụng hết. – Chris

8

tôi muốn làm điều đó là tốt, tôi cho rằng một giải pháp khác sẽ là một bộ lọc mẫu:

from django import template 
register = template.Library() 

@register.filter 
def verbose_name(value): 
    return value._meta.verbose_name 

@register.filter 
def verbose_name_plural(value): 
    return value._meta.verbose_name_plural 

Sau đó, trong mẫu:

1 {{ object|verbose_name }}, 2 {{ object|verbose_name_plural }} 

1 scrib, 2 scribs 
Các vấn đề liên quan