2009-03-01 41 views
20

Tôi có chế độ xem chấp nhận gửi biểu mẫu và cập nhật mô hình.Cách chuyển thông tin bằng cách sử dụng chuyển hướng HTTP (ở Django)

Sau khi cập nhật mô hình, tôi muốn chuyển hướng đến một trang khác và tôi muốn một thông báo như "Trường X được cập nhật thành công" xuất hiện trên trang này.

Làm cách nào để "chuyển" thư này đến trang khác? HttpResponseRedirect chỉ chấp nhận một URL. Tôi đã nhìn thấy điều này trước khi thực hiện trên các trang web khác. Làm thế nào điều này được thực hiện?

+0

Tôi nghĩ vấn đề này khá phổ biến trong mọi khung công tác và không giới hạn ở django/python. – Jiri

+3

@Jiri, vâng, nhưng một số khung công tác cung cấp hỗ trợ cho nó. –

+0

mã hóa thư trong chuỗi truy vấn của url bạn đang chuyển hướng đến. nên làm việc trong bất kỳ khung công tác nào. –

Trả lời

1

Bạn có thể chuyển thông điệp dưới dạng tham số truy vấn không URL mà bạn đang chuyển hướng không? Nó không phải là RESTy khủng khiếp, nhưng nó phải làm việc:

return HttpResponseRedirect('/polls/%s/results/?message=Updated" % p.id) 

và xem chế độ xem thông báo, chà nó cho kẹo và hiển thị nó ở trên cùng.

12

Đây là một built-in tính năng của Django, được gọi là "thông điệp"

Xem http://docs.djangoproject.com/en/dev/topics/auth/#messages

Từ các tài liệu:

Một thông báo được liên kết với một tài khoản. Không có khái niệm hết hạn hoặc dấu thời gian.

Tin nhắn được quản trị viên Django sử dụng sau khi thực hiện thành công. Ví dụ: "Cuộc thăm dò ý kiến ​​Foo đã được tạo thành công ". là một thông điệp.

+1

Tính năng này có yêu cầu người dùng được xác thực không? Hoặc có những người dùng ẩn danh/không được xác thực được hỗ trợ bởi Django không? –

+1

Không yêu cầu người dùng được xác thực. Đối tượng 'người dùng' mà thư được đính kèm có thể là người dùng ẩn danh; django tạo một đối tượng người dùng dựa trên phiên bắt đầu cho khách truy cập đó. Chỉ yêu cầu là khách truy cập của bạn cho phép cookie. –

+9

@Jarret và @ S.Lott sai. Thông điệp tích hợp của Django không dựa trên phiên, chúng được cơ sở dữ liệu hỗ trợ và gắn vào đối tượng người dùng DB thực tế (người dùng "ẩn danh" không tồn tại trong DB), vì vậy chúng chỉ có thể sử dụng được với người dùng đã được xác thực. Hãy thử django-flashcookie hoặc django-session-tin nhắn. –

8

Bạn có thể sử dụng django-flashcookie ứng dụng http://bitbucket.org/offline/django-flashcookie/wiki/Home

nó có thể gửi nhiều thông điệp và có các loại không hạn chế tin nhắn. Cho phép nói rằng bạn muốn một loại thông điệp cảnh báo và một cho các thông báo lỗi, bạn có thể viết

def simple_action(request): 
    ... 
    request.flash['notice'] = 'Hello World' 
    return HttpResponseRedirect("/") 

hoặc

def simple_action(request): 
    ... 
    request.flash['error'] = 'something wrong' 
    return HttpResponseRedirect("/") 

hoặc

def simple_action(request): 
    ... 
    request.flash['notice'] = 'Hello World' 
    request.flash['error'] = 'something wrong' 
    return HttpResponseRedirect("/") 

hoặc thậm chí

def simple_action(request): 
    ... 
    request.flash['notice'] = 'Hello World' 
    request.flash['notice'] = 'Hello World 2' 
    request.flash['error'] = 'something wrong' 
    request.flash['error'] = 'something wrong 2' 
    return HttpResponseRedirect("/") 

và sau đó trong mẫu bạn hiển thị nó với

{% for message in flash.notice %} 
    {{ message }} 
{% endfor }} 

hoặc

{% for message in flash.notice %} 
    {{ message }} 
{% endfor }} 
{% for message in flash.error %} 
    {{ message }} 
{% endfor }} 
0

Trong khi tất cả lời đề nghị công việc cho đến nay, tôi sẽ đề nghị đi với Ry4an của (vượt qua nó trong URL yêu cầu) - chỉ cần thay đổi các văn bản thực tế để một văn bản được mã hóa trong một bộ được xác định trước tin nhắn văn bản.

Hai lợi thế ở đây:

  1. Ít cơ hội của một cái gì đó hack thông qua chà lại nội dung xấu
  2. Bạn có thể khoanh vùng tin nhắn của bạn sau này nếu cần thiết.

Các phương pháp liên quan đến cookie khác .. tốt, chúng không hoạt động nếu trình duyệt không hỗ trợ cookie và đắt hơn một chút .. Nhưng chỉ hơi. Chúng thực sự sạch hơn với mắt.

+0

Tôi thực sự không thích ý tưởng truyền thông điệp người dùng qua URL - nó chỉ phá hủy sự sạch sẽ của Django – tutuDajuju

3

Có rất nhiều các giải pháp

1 Sử dụng phiên bản Django-cốp - nó hỗ trợ gửi tin nhắn đến người giấu mặt

2 phiên

def view1(request): 
    request.session['message'] = 'Hello view2!' 
    return HttpResponseRedirect('/view2/') 


def view2(request): 
    return HttpResponse(request.session['message']) 

3 chuyển hướng với param

return HttpResponseRedirect('/view2/?message=Hello+view2') 

4 Cookies

0

Bạn cũng có thể có url chuyển hướng là đường dẫn đến chế độ xem đã được tham số.

urls.py:

(r'^some/path/(?P<field_name>\w+)/$', direct_to_template, 
    {'template': 'field_updated_message.html', 
    }, 
    'url-name' 
), 

views.py:

HttpResponseRedirect(reverse('url-name', args=(myfieldname,))) 

Lưu ý rằng args = cần phải mất một tuple.

5

Tôi thích ý tưởng sử dụng khung thư nhưng ví dụ trong tài liệu django không hoạt động đối với tôi trong ngữ cảnh của câu hỏi ở trên.

Điều gì thực sự làm phiền tôi, là dòng trong tài liệu django:

If you're using the context processor, your template should be rendered with a RequestContext. Otherwise, ensure messages is available to the template context.

đó là không thể hiểu được để một newbie (như tôi) và cần phải mở rộng khi, tốt hơn với những gì những 2 lựa chọn như thế nào .

Tôi chỉ có thể tìm thấy các giải pháp yêu cầu hiển thị với RequestContext ... không trả lời câu hỏi ở trên.

Tôi tin rằng tôi đã tạo giải pháp cho tùy chọn thứ 2 bên dưới:

Hy vọng điều này sẽ giúp người khác.

== urls.py ==

from django.conf.urls.defaults import * 
from views import * 

urlpatterns = patterns('', 
    (r'^$', main_page, { 'template_name': 'main_page.html', }, 'main_page'), 
    (r'^test/$', test), 

== viewtest.py ==

from django.contrib import messages 
from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 

def test(request): 
    messages.success(request, 'Test successful') 
    return HttpResponseRedirect(reverse('main_page')) 

== viewmain.py ==

from django.contrib.messages import get_messages 
from django.shortcuts import render_to_response 

def main_page(request, template_name): 
    # create dictionary of items to be passed to the template 
    c = { messages': get_messages(request) } 

    # render page 
    return render_to_response(template_name, c,) 

main_page.html == ==

{% block content %} 
    {% if messages %} 
    <div> 
     {% for message in messages %} 
      <h2 class="{{message.tag}}">{{ message.message }}</h2> 
     {% endfor %} 
    </div> 
    {% endif %} 
{% endblock %} 
0

Các giải pháp được sử dụng bởi Pydev UA là ít xâm nhập và có thể được sử dụng mà không sửa đổi gần như không có gì trong mã của bạn. Khi bạn chuyển thư, bạn có thể cập nhật ngữ cảnh của mình trong chế độ xem xử lý thư và trong mẫu của bạn, bạn có thể hiển thị nó.

Tôi đã sử dụng cùng một cách tiếp cận, nhưng thay vào đó, chuyển một văn bản đơn giản, chuyển qua một dict với thông tin trong các trường hữu ích cho tôi. Sau đó, trong khung nhìn, bối cảnh cập nhật là tốt và sau đó trả về khuôn mẫu được trả về với ngữ cảnh được cập nhật.

Đơn giản, hiệu quả và rất không phô trương.

1

Tôi nghĩ rằng mã này nên làm việc cho bạn

request.user.message_set.create(message="This is some message") 
return http.HttpResponseRedirect('/url') 
4

Tôi đã đọc và kiểm tra tất cả câu trả lời, và có vẻ như với tôi rằng con đường để đi hiện đang sử dụng the messaging framework. Một số câu trả lời là khá cũ và có thể là đúng cách tại thời điểm gửi bài.

+0

Rất hữu ích – tutuDajuju

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