11

Tôi có nút trên trang x và trang y chuyển hướng đến trang z. Trên trang z, tôi có một biểu mẫu cần điền. Sau khi lưu, tôi muốn chuyển hướng đến trang x hoặc y (tùy theo điều kiện nào tôi đã thực hiện lúc đầu).Django Chuyển hướng đến chế độ xem trước

Thông thường, bạn sử dụng "chuyển hướng" trong chế độ xem và chỉ định trang bạn muốn chuyển hướng đến. Nhưng bạn sẽ làm gì trong trường hợp như thế này?

Bất kỳ ý tưởng nào?

Cảm ơn!

Trả lời

10

Bạn có thể sử dụng các tham số GET để theo dõi từ trang nào bạn đến trang z. Vì vậy, khi bạn thường đến trang z, chúng tôi nhớ từ trang nào chúng tôi đến. Khi bạn đang xử lý biểu mẫu trên trang z, chúng tôi sử dụng thông tin đã lưu trước đó để chuyển hướng. Vì vậy:

Nút/liên kết trên trang y nên bao gồm một tham số có giá trị là URL hiện tại:

<a href="/page_z/?from={{ request.path|urlencode }}" />go to form</a> 

Sau đó, theo quan điểm page_z của bạn có thể chuyển thông tin này vào template:

def page_z_view(self, request): 
    ... 
    return render_to_response('mytemplate.html', { 'from' : request.GET.get('from', None) }) 

và trong mẫu biểu mẫu của bạn:

<form action="{% if from %}?next={{ from }}{% endif %}" /> 
... 

Vì vậy, bây giờ biểu mẫu - khi được gửi - sẽ chuyển vàoTham sốcho biết vị trí cần quay lại khi biểu mẫu được gửi thành công. Chúng ta cần phải revist quan điểm để thực hiện điều này:

def page_z_view(self, request): 
    ... 
    if request.method == 'POST': 
     # Do all the form stuff 
     next = request.GET.get('next', None) 
     if next: 
      return redirect(next) 
    return render_to_response('mytemplate.html', { 'from' : request.GET.get('from', None)} 
+0

để nút của tôi trên trang y nên một cái gì đó như thế này: ? Vì một số lý do không hoạt động. Đối với một, hình thức của tôi không còn tiết kiệm ngay cả khi "tiếp theo" là dưới hình thức nếu tôi hợp lệ .. Và tôi đang được chuyển hướng đến trang chào đón ban đầu .. mặc dù đó là trang sai để bắt đầu với .. tôi thậm chí không kno nơi nó nhận được điều đó từ lol .. – JohnnyCash

+1

Tôi đã cập nhật câu trả lời - tôi đã đặt thêm/trong '

+0

cảm ơn bạn :) chỉ có một chỉnh sửa nhanh: trong JohnnyCash

-2

Lưu trữ thông tin về các trang mà người dùng của bạn đã truy cập để bạn có thể truy xuất lại sau. Có lẽ nơi tốt nhất để làm điều đó là trong phiên.

2

Django yêu cầu biết những gì các trang người dùng đến từ là:

previous_page = request.META['HTTP_REFERER'] 

Nó sẽ chứa một cái gì đó như:

>>> print(previous_page) 
'http://www.myserver.com/myApp/z' 

Do đó bạn biết bạn đến từ đâu (cảnh báo, coi đó là dữ liệu không an toàn và xác minh nó kỹ lưỡng, thậm chí nó có thể chứa dữ liệu độc hại) và sử dụng thông tin.

Trước tiên, bạn vượt qua nó để mẫu như

data = { 
    ..., 
    # also indicate, that saved data are valid and user can leave 
    'previous_page': previous_page, 
} 

Render trang z.html

return render(request, 'myApp/z.html', data) 

Và trong bản mẫu của trang z, bạn thêm thẻ meta refresh đến. Nó sẽ gây ra điều đó một lần dưới hình thức được lưu và trang nạp, người dùng sẽ được chuyển hướng chuyển hướng trở lại tự động:

{% if form_is_saved and previous_page %}<meta http-equiv="refresh" content="0; url={{ previous_page }}" />{% endif %} 

này có lợi thế, hình thức được lưu bởi z.html trang, nơi nó được lấp đầy và bạn không cần xử lý nó theo trang x và y (đây là cách duy nhất để làm điều đó nếu các trang x và y nằm ngoài ứng dụng Django của bạn).

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