Nếu bạn muốn truy cập dữ liệu lưu trữ trong yêu cầu sau này, bạn sẽ phải lưu trữ nó ở đâu đó. Django cung cấp nhiều cách để lưu trữ này:
1) Bạn có thể sử dụng sessions để lưu trữ các truy vấn: Mỗi du khách ai truy cập vào trang web của bạn sẽ nhận được một đối tượng session rỗng và bạn có thể lưu trữ bất cứ điều gì bạn muốn bên trong đối tượng này, có tác dụng giống như một dict. Nhược điểm: Một khách truy cập không thể thực hiện nhiều tìm kiếm cùng lúc với phân trang.
2) Sử dụng cookie: Nếu bạn đặt cookie được lưu trữ ở phía máy khách, trình duyệt sẽ thêm dữ liệu của cookie vào từng yêu cầu mà bạn có thể truy cập vào nó. Cookie thân thiện với máy chủ hơn, vì bạn không cần trình quản lý phiên cho chúng trên máy chủ, nhưng dữ liệu được lưu trữ trong cookie hiển thị (và có thể chỉnh sửa) cho máy khách. Nhược điểm: giống như trước đây.
3) Sử dụng trường ẩn: Bạn có thể thêm biểu mẫu với một số trường ẩn trên trang kết quả tìm kiếm của bạn và lưu truy vấn bên trong chúng. Sau đó, khách hàng sẽ gửi lại truy vấn bất cứ khi nào bạn gửi biểu mẫu. Nhược điểm: Bạn phải sử dụng một biểu mẫu với các nút gửi để phân trang trên trang của bạn (các liên kết đơn giản sẽ không hoạt động).
4) Tạo liên kết chứa truy vấn: Thay vì sử dụng POST, bạn cũng có thể sử dụng GET. Ví dụ: bạn có thể có liên kết như "/search/hello+world/?order=votes"
và "liên kết được phân trang" như "/search/hello+world/2/?order-votes"
. Sau đó, truy vấn có thể dễ dàng được truy xuất từ URL. Nhược điểm: Lượng dữ liệu tối đa bạn có thể gửi qua GET bị giới hạn (Nhưng đó không phải là vấn đề đối với tìm kiếm đơn giản).
5) Sử dụng kết hợp: Bạn có thể lưu trữ tất cả dữ liệu trong phiên hoặc cơ sở dữ liệu và truy cập chúng thông qua khóa được tạo mà bạn có thể đặt trong URL. Sau đó, URL có thể trông giống như "/search/029af239ccd23/2"
(đối với trang thứ 2) và bạn có thể sử dụng khóa để truy cập một lượng lớn dữ liệu mà bạn đã lưu trữ trước đó. Điều này giúp loại bỏ nhược điểm của giải pháp 1 cũng như giải pháp của giải pháp 4. Hạn chế mới: nhiều việc :)
6) Sử dụng AJAX: với ajax bạn có thể lưu trữ dữ liệu bên trong một số js-biến trên các mặt hàng, sau đó có thể truyền cho các yêu cầu khác Và kể từ ajax sẽ chỉ cập nhật danh sách kết quả của bạn. , các biến không bị mất
Cảm ơn, điều này hữu ích. Chỉ cần giải nén câu hỏi này thêm một chút: đây có phải là mục đích sử dụng cho lớp paginator không? Chế độ xem của tôi xử lý biểu mẫu tìm kiếm ban đầu, sau đó gửi mẫu đối tượng paginator.page() cho trang đầu tiên. Danh sách kết quả được tạo từ object_list cho trang đó. Có vẻ kỳ quặc là tôi không thể gửi toàn bộ tập kết quả tìm kiếm, và bằng cách nào đó trang qua nó mà không gửi lại tìm kiếm cho mọi trang. Nếu đó là mục đích sử dụng cho lớp, tôi có thể làm việc với nó. Chỉ muốn chắc chắn rằng tôi không bỏ lỡ điều gì đó hiển nhiên. Cảm ơn! – andyashton
Có, đó là mục đích sử dụng. Đừng quên rằng Django là một khuôn khổ web, và theo yêu cầu web tự nhiên của họ không phải là nhà nước. Vì vậy, nếu bạn muốn giữ trạng thái, bạn sẽ phải lưu trữ nó ở đâu đó - và tux21b đã cho bạn một số tùy chọn về vị trí. –
Rất hữu ích, cảm ơn cả hai. – andyashton