Django - sự khác biệt giữa render (), render_to_response () và direct_to_template () là gì?


238

Sự khác biệt (về ngôn ngữ mà một python / django noob có thể hiểu) trong một cái nhìn giữa render() , render_to_response()direct_to_template()?

ví dụ từ các ví dụ ứng dụng cơ bản của Nathan B khiếp sợ

def comment_edit(request, object_id, template_name='comments/edit.html'):
    comment = get_object_or_404(Comment, pk=object_id, user=request.user)
    # ...
    return render(request, template_name, {
        'form': form,
        'comment': comment,
    })

Nhưng tôi cũng đã thấy

    return render_to_response(template_name, my_data_dictionary,
              context_instance=RequestContext(request))

    return direct_to_template(request, template_name, my_data_dictionary)

Sự khác biệt, những gì để sử dụng trong bất kỳ tình huống cụ thể?

Câu trả lời:


185

https://docs.djangoproject.com/en/1.8/topics/http/shortype/#render

render(request, template[, dictionary][, context_instance][, content_type][, status][, current_app])

render()là một lối tắt mới cho thương hiệu render_to_responsetrong 1.3 sẽ tự động sử dụng RequestContextmà tôi chắc chắn sẽ sử dụng từ bây giờ.


2020 EDIT: Cần lưu ý rằng render_to_response()đã bị xóa trong Django 3.0

https://docs.djangoproject.com/en/1.8/topics/http/shortype/#render-to-response

render_to_response(template[, dictionary][, context_instance][, mimetype])¶

render_to_responselà chức năng kết xuất tiêu chuẩn của bạn được sử dụng trong các hướng dẫn và như vậy. Để sử dụng, RequestContextbạn phải xác địnhcontext_instance=RequestContext(request)


https://docs.djangoproject.com/en/1.8/ref/generic-view/#django-view-generic-simple-direct-to-template

direct_to_templatelà một khung nhìn chung mà tôi sử dụng trong các khung nhìn của mình (trái ngược với các url của tôi) vì giống như render()hàm mới , nó tự động sử dụng RequestContextvà tất cả các khung nhìn của nócontext_processor s .

Nhưng direct_to_template nên tránh vì các quan điểm chung dựa trên chức năng bị phản đối. Sử dụng renderhoặc một lớp học thực tế, xem https://docs.djangoproject.com/en/1.3/topics/generic-view-migration/

Tôi rất vui vì đã không gõ RequestContexttrong một thời gian dài.


1
Điều chỉnh. Theo tài liệu render()có sẵn từ 1.3.
AppleGrew

@AppleGrew, bắt đẹp! "Cộng đồng" đã sửa đổi bài đăng của tôi để trỏ đến các chi nhánh cụ thể và họ đã chọn 1.4
Yuji 'Tomita' Tomita

6
Lưu ý: các khung nhìn chung dựa trên chức năng không được dùng nữa, không phải các khung nhìn dựa trên chức năng . Các chế độ xem chung đi kèm với Django hiện được triển khai bằng cách sử dụng các chế độ xem dựa trên lớp (TemplateView), chúng được sử dụng để thực hiện dưới dạng các hàm (direct_to_template, v.v.). Lượt xem được triển khai dưới dạng chức năng, tùy chọn cá nhân của tôi, vẫn được hỗ trợ và điều đó sẽ không thay đổi.
Nick Zalutskiy

40

Đọc lại câu trả lời của Yuri, Fábio và Frosts cho Django noob (tức là tôi) - gần như chắc chắn là một sự đơn giản hóa, nhưng một điểm khởi đầu tốt?

  • render_to_response()là "bản gốc", nhưng yêu cầu bạn đặt context_instance=RequestContext(request)gần như mọi lúc, một PITA.

  • direct_to_template()được thiết kế để chỉ được sử dụng trong urls.py mà không có chế độ xem được xác định trong view.py nhưng nó có thể được sử dụng trong view.py để tránh phải nhập RequestContext

  • render()là một phím tắt để render_to_response()tự động cung cấp context_instance=Request.... Nó có sẵn trong phiên bản phát triển django (1.2.1) nhưng nhiều người đã tạo các phím tắt riêng như cái này , cái này hoặc cái đã ném tôi ban đầu, Nathans basic.tools. phím tắt


Liên kết đầu tiên ( import-awgie.com/ từ ) đang cung cấp 404
Lucio

Vâng, điều đó có thể xảy ra trên các liên kết gần 4 năm tuổi!
Ryan

24

Kết xuất là

def render(request, *args, **kwargs):
    """ Simple wrapper for render_to_response. """
    kwargs['context_instance'] = RequestContext(request)
    return render_to_response(*args, **kwargs)

Vì vậy, thực sự không có sự khác biệt giữa render_to_responsengoại trừ nó bao bọc bối cảnh của bạn làm cho bộ xử lý trước mẫu hoạt động.

Trực tiếp đến mẫu là một cái nhìn chung .

Thực sự không có ý nghĩa trong việc sử dụng nó ở đây vì có chi phí hoạt động render_to_responseở dạng chức năng xem.


12

Từ tài liệu django :

render () giống như một cuộc gọi đến render_to_response () với một đối số bối cảnh_instance buộc sử dụng RequestContext.

direct_to_templatelà một cái gì đó khác nhau. Đây là chế độ xem chung sử dụng từ điển dữ liệu để hiển thị html mà không cần lượt xem, bạn sử dụng nó trong urls.py. Tài liệu ở đây


6

Chỉ cần một lưu ý tôi không thể tìm thấy trong các câu trả lời ở trên. Trong mã này:

context_instance = RequestContext(request)
return render_to_response(template_name, user_context, context_instance)

Tham số thứ ba context_instancethực sự làm gì? Là RequestContext, nó thiết lập một số bối cảnh cơ bản sau đó được thêm vào user_context. Vì vậy, mẫu được bối cảnh mở rộng này. Những biến nào được thêm vào được đưa ra bởi TEMPLATE_CONTEXT_PROCESSORStrong settings.py. Ví dụ django.contrib.auth.context_ Processors.auth thêm biến uservà biến permsau đó có thể truy cập trong mẫu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.