2012-02-15 36 views
5

Trong trang web của tôi, tôi có biểu mẫu đang được lấp đầy dữ liệu sau một số yêu cầu ajax. Ví dụ khi người dùng chọn một mục từ danh sách, một yêu cầu ajax đơn giản được gửi đến cơ sở dữ liệu mà mục đó đã được chọn (nhưng chưa được xác nhận). Sau đó, danh sách trên trang web tải lại bằng cách sử dụng một yêu cầu ajax simpe (chỉ danh sách, không phải toàn bộ trang) để tìm nạp danh sách mục mới.django, quay lại trang trước sau biểu mẫu BÀI ĐĂNG gửi

Tôi nghĩ rằng đây thực sự là việc thực hiện giỏ hàng cổ điển.

Tuy nhiên, khi người dùng nhấn gửi (biểu mẫu gửi POST cổ điển, không phải POST ajax vì một số lý do liên quan đến việc triển khai) để xác nhận toàn bộ danh sách, tôi muốn quay lại trang hiện tại. (Trang hiện tại khác nhau) Điều này có thể? Tôi đang sử dụng django.

Cảm ơn.

Trả lời

11

Bạn có thể cung cấp một tham số next GET khi nộp mẫu đơn, tương tự như django.contrib.auth của login() phương pháp:

https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.views.login:

<form action="/url/to/post/form/?next={{ some_variable }}"> 

nơi biến đơn giản có thể là URL hiện tại (lấy từ yêu cầu) hoặc URL được tạo. Trong giao diện xử lý hình thức, chỉ cần kiểm tra cho một tham số next và chuyển hướng một cách thích hợp:

from django.shortcuts import redirect 
if 'next' in request.GET: 
    return redirect(request.GET['next']) 
0

trang hiện tại là một thuật ngữ rất mơ hồ nhưng tôi giả sử bạn muốn trang giới thiệu bạn đến trang biểu mẫu, điều này bình thường (không phải luôn luôn) được lưu trữ trong tiêu đề HTTP_REFERRER của chính yêu cầu đó. Bạn có thể thử tìm nạp thông tin đó từ yêu cầu và thực hiện chuyển hướng.

+0

Cảm ơn bạn rất nhiều. Bạn nói "không phải lúc nào", tại sao vậy? – xpanta

+2

Điều này tùy thuộc vào trình duyệt của người dùng để gửi liên kết giới thiệu. Một số trình duyệt không có, hoặc có một tùy chọn để vô hiệu hóa nó - đáng chú ý là Opera. Một sửa chữa khác có thể bao gồm đường dẫn hiện tại như là một đầu vào ẩn trong các biểu mẫu và tra cứu giá trị đó trong 'request.POST'. – AdamKG

1

Bạn có thể sử dụng/Redirect/Nhận mẫu thiết kế Post (PRG). Để biết thêm thông tin chung về Đăng/Chuyển hướng/Nhận, vui lòng xem phần sau: http://en.wikipedia.org/wiki/Post/Redirect/Get Có một số sơ đồ quy trình xử lý tốt đẹp ở đó.

Một ví dụ chung của một quan điểm thực hiện PRG có thể trông giống như sau:

# urls.py 
urlpatterns = patterns('', 
    url(r'^/$', views.my_view, name='named_url'), 
) 

# forms.py 
class MyForm(forms.Form): 
    pass # the form 

# views.py 
def my_view(request, template_name='template.html'): 
    """ Example PostRedirectGet 
    This example uses a request context, but isn't 
    necessary for the PRG 
    """ 
    if request.POST: 
     form = MyForm(request.POST) 
     if form.is_valid(): 
      try: 
       form.save() 
       # on success, the request is redirected as a GET 
       return HttpResponseRedirect(reverse('named_url')) 
      except: 
       pass # handling can go here 
    else: 
     form = MyForm() 

    return render_to_response(template_name, { 
     'form':form 
    }, context_instance=RequestContext(request)) 

Nếu bạn cần phải làm điều gì đó thú vị hơn với GET, reverse có thể mất args và kwargs. Thao tác các tham số chế độ xem, url_pattern và cuộc gọi ngược để hiển thị kết quả bạn muốn xem.

Một lưu ý bổ sung là bạn không phải chuyển hướng đến cùng một chế độ xem (như ví dụ này). Nó có thể là bất kỳ chế độ xem được đặt tên nào mà bạn muốn chuyển hướng người dùng đến.

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