2009-02-08 29 views
15

Tôi đang dụng cụ xung quanh với Django và tôi tự hỏi nếu có một cách đơn giản để tạo liên kết "quay lại" cho trang trước bằng cách sử dụng hệ thống mẫu.Mẫu Django: tạo liên kết "quay lại"?

Tôi cho rằng trong trường hợp xấu nhất, tôi có thể lấy thông tin này từ đối tượng yêu cầu trong hàm xem và chuyển nó theo phương thức hiển thị mẫu, nhưng tôi hy vọng tôi có thể tránh tất cả mã soạn sẵn này.

Tôi đã kiểm tra tài liệu mẫu Django và tôi chưa thấy bất kỳ điều gì đề cập đến điều này một cách rõ ràng.

+0

Khi bạn quay trở lại, trang được hiển thị lại, điều này có nghĩa là mọi quá trình xử lý (truy vấn cơ sở dữ liệu, tải xuống tài nguyên v.v ...) sẽ xảy ra. Để ngăn chặn điều đó, hãy sử dụng trang trí '@ cache_page'. –

Trả lời

12

Vâng, bạn có thể kích hoạt:

'django.core.context_processors.request', 

trong settings.TEMPLATE_CONTEXT_PROCESSORS khối của bạn và móc ra giới thiệu nhưng đó là một chút buồn nôn và có thể phá vỡ ở khắp mọi nơi.

Hầu hết các địa điểm bạn muốn điều này (ví dụ: chỉnh sửa trang bài viết trên SO) bạn có một đối tượng thực để móc nối (trong ví dụ đó, bài đăng) để bạn có thể dễ dàng tìm ra được.

+0

Đây là thông tin tốt và tôi tình cờ gặp "Model.get_absolute_url" trong tài liệu sau khi đọc. Điều này thực sự giải quyết được vấn đề trong trường hợp của tôi, nhưng tôi vẫn tò mò quá trình hành động tốt nhất nếu bạn không có một đối tượng để trỏ đến. –

+0

Thực sự phụ thuộc vào hoàn cảnh. Nếu có một số cách để làm trang nào "nên" là trang trước, tôi sẽ đi theo cách đó .. Nhưng một số lần không thể và kiểm tra liên kết giới thiệu có thể là tùy chọn duy nhất của bạn (trừ việc cho phép người dùng sử dụng nút quay lại của họ) . – Oli

+0

Tôi một lần đã đi xuống con đường cố gắng để làm điều này thông qua các biến phiên, nhưng đó là một sai lầm; giòn và bẻ gãy mọi lúc. Lựa chọn của bạn là những lựa chọn mà Oli đã đề cập, hoặc bằng cách sử dụng JavaScript để nhấp vào nút Quay lại cho chúng. –

0

Bạn luôn có thể sử dụng tùy chọn phía khách hàng mà là rất đơn giản:

<a href="javascript:history.go(1)">Back</a> 
+3

Tôi thực sự ghét các liên kết như vậy. Thứ nhất, chúng không hoạt động khi bạn truy cập một trang từ liên kết đã lưu/trang web khác. Thứ hai, tôi chỉ kích hoạt Javascript cho các trang tin cậy (sử dụng phần mở rộng firefox NoScript). Có nhiều lý do khác, nhưng không gian nhận xét bị giới hạn. –

+3

Xấu xí, nhưng câu trả lời hợp lệ. – muhuk

+0

Nó không phải là mã tốt nhất bao giờ tôi đồng ý. Nhưng lợi thế cao là cực kỳ đơn giản và nó hoạt động. Nó cũng sẽ hoạt động nếu bạn đến từ một trang web khác vì nó sử dụng chức năng BACK của trình duyệt bất kể bạn đến từ đâu. – nivhab

25

Trên thực tế nó là go(-1).

<input type=button value="Previous Page" onClick="javascript:history.go(-1);"> 
+3

Câu trả lời cho các câu trả lời khác thuộc về các ý kiến ​​không có trong câu trả lời mới. –

+1

@TM: đây là câu trả lời chính xác, vì vậy nó tốt như của riêng nó. – aehlke

+2

xấu xí, nhưng hoạt động –

15

Giải pháp này làm việc ra cho tôi:

<a href="{{request.META.HTTP_REFERER}}">Go back</a> 

Nhưng đó là trước đây thêm 'django.core.context_processors.request', để TEMPLATE_CONTEXT_PROCESSORS trong cài đặt của dự án của bạn.

+0

Tìm nó hữu ích và sạch sẽ ngay bây giờ vào tháng 5 năm 2016 !!! –

+0

công trình này, nhưng sau khi django 1.10 là: 'django.template.context_processors.request', –

0

Đối với nút 'quay lại' trong các biểu mẫu thay đổi dành cho quản trị viên Django, điều tôi làm là bộ lọc mẫu tùy chỉnh để phân tích cú pháp và giải mã biến 'preserve_filters' trong mẫu. Tôi đặt sau đây trên một tập tin mẫu tùy chỉnh/admin/submit_line.html:

<a href="../{% if original}../{% endif %}?{{ preserved_filters | decode_filter }}"> 
    {% trans "Back" %} 
</a> 

Và sau đó tạo ra một mẫu tùy chỉnh bộ lọc:

from urllib.parse import unquote 
from django import template 

def decode_filter(variable): 
    if variable.startswith('_changelist_filters='): 
     return unquote(variable[20:]) 
    return variable 

register = template.Library() 
register.filter('decode_filter', decode_filter) 
0

Sử dụng giải pháp phía khách hàng sẽ là giải pháp thích hợp.

<a href="javascript:history.go(-1)" class="btn btn-default">Cancel</a> 
Các vấn đề liên quan