2009-07-28 29 views
5

Làm thế nào bạn có thể thực hiện phân loại phức tạp trên một đối tượng trước khi chuyển nó vào mẫu? Ví dụ: đây là chế độ xem của tôi:Sắp xếp và lập chỉ mục vào danh sách trong mẫu Django?

@login_required 
def overview(request): 
    physicians = PhysicianGroup.objects.get(pk=physician_group).physicians 

for physician in physicians.all(): 
    physician.service_patients.order_by('bed__room__unit', 'bed__room__order', 'bed__order') 

return render_to_response('hospitalists/overview.html', RequestContext(request, {'physicians': physicians,})) 

Đối tượng bác sĩ không được đặt hàng đúng trong mẫu. Tại sao không?

Ngoài ra, làm cách nào để bạn lập chỉ mục vào danh sách bên trong mẫu? Ví dụ, (điều này không làm việc):

{% for note_type in note_types %} 
    <div><h3>{{ note_type }}</h3> 
    {% for notes in note_sets.index(parent.forloop.counter0) %} 
    #only want to display the notes of this note_type! 
     {% for note in notes %} 
     <p>{{ note }}</p> 
     {% endfor %} 
    {% endfor %} 
    </div> 
{% endfor %} 

Cảm ơn bó, Pete

+0

@Peter Mortensen, tại sao bạn phải loại bỏ lòng biết ơn khỏi bài đăng của mọi người? Xem bản sửa đổi số 8 của câu hỏi này. Tôi không thấy điều này có thể chấp nhận được. – slypete

Trả lời

11

Như những người khác đã chỉ ra, cả hai vấn đề của bạn được giải quyết tốt nhất bên ngoài mẫu - trong mô hình hoặc trong chế độ xem. Một chiến lược sẽ là thêm các phương thức trợ giúp vào các lớp có liên quan.

Bắt một danh sách được sắp xếp bệnh nhân của bác sĩ:

class Physician(Model): 
    ... 
    def sorted_patients(self): 
     return self.patients.order_by('bed__room__unit', 
            'bed__room__order', 
            'bed__order') 

Và trong mẫu, sử dụng physician.sorted_patients hơn physician.patients.

Để "hiển thị ghi chú của ghi chú này", có vẻ như bạn có thể muốn có phương thức notes cho lớp lưu ý. Từ mô tả của bạn tôi không chắc chắn nếu điều này là một lớp mô hình hay không, nhưng nguyên tắc là như nhau:

class NoteType: 
    ... 
    def notes(self): 
     return <calculate note set> 

Và sau đó mẫu:

{% for note_type in note_types %} 
    <div><h3>{{ note_type }}</h3></div> 
    {% for note in note_type.notes %} 
     <p>{{ note }}</p> 
    {% endfor %} 
    </div> 
{% endfor %} 
+0

Cảm ơn, hơi khó để tôi có được đầu của tôi xung quanh thực tế là hầu như không có gì có thể được thực hiện trong mẫu!Thậm chí không lập chỉ mục vào danh sách! – slypete

+0

Trong các phiên bản gần đây của django bạn * có thể * lập chỉ mục vào danh sách. –

4

"Tôi muốn làm điều này từ bên trong một mẫu:"

Đừng . Làm điều đó trong chức năng xem nơi nó thuộc về.

Vì câu hỏi chưa hoàn chỉnh nên không thể đoán được ở mô hình dữ liệu và cung cấp giải pháp chính xác.

results= physician.patients.order_by('bed__room__unit', 'bed__room__order', 'bed__order') 

Phải đủ. Cung cấp results cho mẫu để hiển thị. Nó theo đúng thứ tự.

Nếu điều này không phân loại đúng cách (có thể do một số mô hình tinh tế) thì bạn luôn có loại thay thế này.

def by_unit_room_bed(patient): 
    return patient.bed.room.unit, patient.bed.room.order, patient.bed.order 

patient_list = list(physician.patients) 
patient_list.sort(key=by_unit_room_bed) 

Cung cấp patient_list cho mẫu để hiển thị. Nó theo đúng thứ tự.

"làm thế nào để bạn chỉ vào một danh sách bên trong mẫu"

Tôi không chắc chắn những gì bạn đang cố gắng để làm, nhưng hầu hết thời gian, câu trả lời là "Không". Làm điều đó trong chức năng xem.

Mẫu chỉ lặp qua các danh sách đơn giản điền vào các mẫu HTML đơn giản.

Nếu có vẻ quá phức tạp đối với mẫu, đó là. Giữ mẫu đơn giản - đó chỉ là bản trình bày. Việc xử lý đi trong chức năng xem

+0

Làm thế nào để bạn đề xuất tôi sắp xếp các đối tượng trong đối tượng trước khi truyền cho đối tượng? Ví dụ, điều này không hoạt động: physician.service_patients = physician.service_patients.all(). Order_by ('bed__room__unit', 'bed__room__order', 'bed__order') – slypete

+0

Ý bạn là "không hoạt động". Nó làm gì sai? –

+0

Bài tập làm cho đối tượng không sử dụng được vì service_patients là ForeignKey. – slypete

1

Bạn sẽ có thể xây dựng các truy vấn yêu cầu thiết lập theo quan điểm của mình và vượt qua nó cho mẫu của bạn:

def myview(request): 
    patients = Physician.patients.order_by('bed__room__unit', 
              'bed__room__order', 
              'bed__order') 
    return render_to_response('some_template.html', 
           dict(patients=patients), 
           mimetype='text/html') 

Mẫu của bạn có thể sau đó vòng qua patients mà sẽ chứa các lệnh các kết quả. Điều này không làm việc cho bạn?

EDIT: Để lập chỉ mục, chỉ cần sử dụng cú pháp dấu chấm: mylist.3 trong mẫu trở thành mylist[3] trong python. Xem http://docs.djangoproject.com/en/dev/ref/templates/api/#rendering-a-context để biết thêm thông tin.

+0

Không có nó kể từ khi tôi vượt qua trong một bác sĩ thiết lập mẫu. Có thể phân loại từng bệnh nhân của bác sĩ trong bác sĩ được đặt trước khi chuyển mẫu đó tới mẫu không? – slypete

+0

Tôi đoán tôi có thể vượt qua trong một bộ bác sĩ và một danh sách các bộ bệnh nhân đặt hàng, nhưng nó không cảm thấy đúng ... nếu bạn biết những gì tôi có ý nghĩa. Tôi chỉ cần vượt qua trong một bộ và tôi nghĩ rằng tôi chỉ không biết làm thế nào để làm điều đó. – slypete

+0

Tôi cho rằng Bác sĩ là một người mẫu và bệnh nhân là người quản lý mô hình. Tôi đoán bạn có thể tạo ra một phương pháp thể hiện trên một bác sĩ: get_patients, mà chỉ trả về một bộ truy vấn của bệnh nhân được sắp xếp. Bạn sẽ có thể gọi nó trong một mẫu và lặp qua tập kết quả. – ars

0

Đây là một cách để làm việc đó , mặc dù rất xấu xí:

{% for note in note_sets|slice:"forloop.counter0"|first %}

+0

Rất tiếc, tính năng này không hoạt động. Chỉ cần thử nó. –

+0

lol, điều này thật khó chịu. – slypete

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