2009-08-14 43 views
138

Tôi có mã này trong mẫu, mà tôi muốn in số phiếu bầu mà mỗi sự lựa chọn có. phiếu bầu chỉ là từ điển trong khi lựa chọn là đối tượng mô hình.cách truy cập phần tử từ điển trong mẫu django?

{% for choice in choices %} 
    {{choice.choice}} - {{votes[choice.id]}} <br /> 
{% endfor %} 

nó đặt ra một ngoại lệ với thông điệp này "Không thể phân tích thời gian còn lại"

Trả lời

47

Để vang/mở rộng khi bình luận của Jeff, những gì tôi nghĩ rằng bạn nên đặt mục tiêu cho chỉ đơn giản là một tài sản trong lớp Choice của bạn cho phép tính số phiếu biểu quyết liên quan đến đối tượng đó:

class Choice(models.Model): 
     text = models.CharField(max_length=200) 

     def calculateVotes(self): 
      return Vote.objects.filter(choice = self).count() 

     votes = property(calculateVotes) 

Và sau đó trong mẫu của bạn , bạn có thể làm:

{% for choice in choices %} 
      {{choice.choice}} - {{choice.votes}} <br /> 
    {% endfor %} 

Thẻ mẫu, là IMHO quá mức cần thiết cho giải pháp này, nhưng nó cũng không phải là giải pháp khủng khiếp. Mục tiêu của các mẫu trong Django là cách ly bạn khỏi mã trong các mẫu của bạn và ngược lại.

Tôi sẽ thử phương pháp trên và xem SQL mà ORM tạo ra vì tôi không chắc chắn trên đầu của tôi nếu nó sẽ lưu trước các thuộc tính và chỉ tạo một subselect cho thuộc tính hoặc nếu nó sẽ lặp lại/theo yêu cầu chạy truy vấn để tính số phiếu bầu. Nhưng nếu nó tạo ra các truy vấn khắc nghiệt, bạn luôn có thể điền thuộc tính trong chế độ xem của mình với dữ liệu bạn đã tự thu thập.

+0

nhờ @ John Ewart, giải pháp của bạn làm việc cho tôi. Tôi newbie để django và python và không thể hình dung làm thế nào để có được sql mà ORM tạo ra. – Mohamed

+0

Bạn có thể tìm câu trả lời cho bit đó ở đây: http://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django -is-running Nó khá đơn giản, thực sự và có thể được hiển thị trong mẫu của bạn, hoặc đăng nhập với một cơ sở khai thác gỗ, nhưng bạn phải nhớ bật DEBUG để làm việc này. –

+0

giải pháp này là hoàn hảo cho một vấn đề tôi đã có với django templating + google mô hình ứng dụng động cơ. Tôi ước tôi có thể bầu bạn hai lần. –

15

Bạn cần phải tìm (hoặc xác định) một 'get' mẫu thẻ, ví dụ, here.

Định nghĩa tag:

@register.filter 
def hash(h, key): 
    return h[key] 

Và nó được sử dụng như:

{% for o in objects %} 
    <li>{{ dictionary|hash:o.id }}</li> 
{% endfor %} 
+1

xem xét 'h.get (key, 'DEFAULT_VALUE') 'vì KeyError – semiomant

3

Tốt nhất, bạn sẽ tạo ra một phương pháp trên đối tượng lựa chọn mà tìm thấy chính nó trong phiếu, hoặc tạo ra một mối quan hệ giữa mô hình. Một thẻ mẫu thực hiện tra cứu từ điển cũng sẽ hoạt động.

141

bạn có thể sử dụng các ký hiệu dấu chấm:

tra cứu Dot thể được tóm tắt như này: khi hệ thống mẫu gặp một dấu chấm trong tên biến, nó cố gắng tra cứu sau, trong lệnh này :

  • từ điển tra cứu (ví dụ, foo [ "bar"])
  • Thuộc tính tra cứu (ví dụ, foo.bar)
  • gọi Phương pháp (ví dụ, foo.bar())
  • Danh sách-index tra cứu (ví dụ, foo [2])

Hệ thống sử dụng tra cứu loại đầu tiên mà làm việc. Đó là logic mạch ngắn.

+38

Trong trường hợp lựa chọn của ông là một biến. Việc thực hiện .choice sẽ tra cứu giá trị cho "lựa chọn" chính thay vì giá trị cho lựa chọn chính. – ibz

+0

+1 cho thông tin, mặc dù câu hỏi là loại câu hỏi "đoán suy nghĩ của tôi". Cảm ơn Wilhelm. – eficker

+1

Điều này thậm chí hoạt động với các từ điển lồng nhau. Mã Python: 'my_dict [1] [2]' Mã mẫu: 'my_dict.1.2' – djsmith

216
choices = {'key1':'val1', 'key2':'val2'} 

Dưới đây là các mẫu:

 
<ul> 
{% for key, value in choices.items %} 
    <li>{{key}} - {{value}}</li> 
{% endfor %} 
</ul> 

Về cơ bản, .items là một từ khóa Django để tách một từ điển thành một danh sách (key, value) cặp. Điều này cho phép lặp qua một từ điển trong một mẫu Django.

+16

.có nghĩa là bạn vừa giải quyết được vấn đề của mình. –

+2

nó không hoạt động cho tôi. – anacarolinats

+0

@anacarolinats (và những người khác) chỉ cần đảm bảo bạn lặp lại cả khóa, giá trị cho choice.items. Nó vẫn hoạt động. – OldTinfoil

2

Tương tự như các câu trả lời bằng @russian_spy:

<ul> 
{% for choice in choices.items %} 
    <li>{{choice.0}} - {{choice.1}}</li> 
{% endfor %} 
</ul> 

này có thể phù hợp để phá vỡ xuống từ điển phức tạp hơn.

0

Sử dụng từ điển Items

 {% for key, value in my_dictionay.items %} 
      <li>{{ key }} : {{ value }}</li> 
     {% endfor %} 
Các vấn đề liên quan