2010-09-02 4 views
42

Tôi có chế độ xem xác thực và lưu biểu mẫu. Sau khi biểu mẫu được lưu, tôi muốn chuyển hướng quay lại chế độ xem list_object với thông báo thành công "biểu mẫu cho khách hàng xyz đã được cập nhật thành công ..."Làm cách nào để chuyển hướng trong Django bằng ngữ cảnh?

HttpResponseRedirect dường như không hoạt động, vì nó chỉ có một đối số cho url, không có cách nào để chuyển từ điển với nó.

Tôi đã thử sửa đổi trình bao bọc của mình cho object_list để đưa ra dict làm thông số có ngữ cảnh cần thiết. Tôi trả lại một cuộc gọi đến trình bao bọc này từ bên trong khung nhìn để lưu biểu mẫu. Tuy nhiên, khi trang được hiển thị, url là '/ customer_form /' thay vì '/ list_customers /'. Tôi đã thử sửa đổi các đối tượng yêu cầu, trước khi chuyển nó vào wrapper object_list, nhưng điều đó không làm việc.

Cảm ơn.

+7

Lưu ý đối với người tìm kiếm trong tương lai: Hãy nhớ đọc qua câu trả lời được chấp nhận vì câu trả lời được chấp nhận. –

Trả lời

19

Xin lưu ý câu trả lời gợi ý ở đây là chỉ áp dụng đối với Django < 1.2:

Bạn có kiểm soát đối với quan điểm cho rằng bạn đang chuyển hướng đến? Trong trường hợp đó, bạn có thể lưu ngữ cảnh trong phiên trước khi chuyển hướng. Chế độ xem đích có thể nhận bối cảnh (và xóa nó) từ phiên và sử dụng nó để hiển thị mẫu.

Nếu chỉ yêu cầu của bạn là hiển thị thông báo thì có cách tốt hơn để thực hiện việc này. Chế độ xem đầu tiên của bạn có thể tạo thông báo cho hiện tại bằng cách sử dụng auth và có chế độ xem thứ hai đọc và xóa nó. Một cái gì đó như thế này:

def save_form(request, *args, **kwargs): 
    # all goes well 
    message = _("form for customer xyz was successfully updated...") 
    request.user.message_set.create(message = message) 
    return redirect('list_view') 

def list_view(request, *args, **kwargs): 
    # Render page 

# Template for list_view: 
{% for message in messages %} 
    ... 
{% endfor %} 

Tin nhắn được lưu vào cơ sở dữ liệu. Điều này có nghĩa là bạn có thể truy cập chúng ngay cả sau khi chuyển hướng. Chúng được tự động đọc bị xóa khi hiển thị mẫu. Bạn sẽ phải sử dụng RequestContext để làm việc này.

Đối với Django => 1.2 đọc câu trả lời liên quan đến thông điệp

+7

Câu trả lời khác có lẽ nên được chấp nhận là câu trả lời chính xác ngay bây giờ. Điều này đã không được chấp nhận trong django 1.2 và loại bỏ trong django 1.4 (như đã đề cập trong câu trả lời khác). –

57

request.user.message_set đã bị phản đối trong Django 1.2 và đã bị xóa từ Django 1.4, message framework nên được sử dụng để thay thế.

from django.contrib import messages 

# messages.add_message(request, level, message, extra_tags='', fail_silently=False) 
messages.add_message(request, messages.INFO, "Your Message") 

Tin nhắn sau đó có thể được trả lại trên mẫu với:

{% if messages %} 
    <ul class="messages"> 
     {% for message in messages %} 
      <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
     {% endfor %} 
    </ul> 
{% endif %} 
6

Để mở rộng về câu trả lời hữu ích Antoine: nếu bạn muốn xử lý các thông điệp trong mô-đun quan điểm của bạn, chứ không phải là mẫu:

from django.contrib.messages import get_messages 

def my_view(request): 
    # Process your form data from the POST, or whatever you need to do 

    # Add the messages, as mentioned above 
    messages.add_message(request, messages.INFO, form.cleaned_data['name']) 

    return HttpResponseRedirect('/other_view_url/') 

def other_view(request): 
    storage = get_messages(request) 
    name = None 
    for message in storage: 
     name = message 
     break 
    return render(request, 'general/other_view.html', {'name': name})