2010-02-11 30 views
59

Tôi gặp sự cố lạ, tôi muốn thêm truy vấn toàn cục bằng bộ xử lý ngữ cảnh. Đây là cách tôi đã làm nó bằng cách following:Django, bộ xử lý ngữ cảnh mẫu

đã processor.py trong ứng dụng của tôi như vậy:

from myproject.myapp.models import Foo 

def foos(request): 
    return {'foos': Foo.objects.all()} 

và vào cuối setting.py của tôi, tôi đã thêm này:

TEMPLATE_CONTEXT_PROCESSORS = ('myapp.processor.foos',) 

Cuối cùng tôi vượt qua quan điểm của tôi như thế này:

def index_view(request): 

    return render_to_response('index.html', {}, context_instance=RequestContext(request)) 

và tại mẫu index.html của tôi :

<select id="select_foo"> 
{% for foo in foos %} 
    <option value="/{{ foo.slug }}">{{ foo.name }}</option> 
{% endfor %} 
</select> 

Và cuối cùng url của tôi:

(r'^$', 'myapp.views.index_view'), 

hiển thị foos tôi mà không có bất kỳ vấn đề, tuy nhiên MEDIA_URL tôi và bối cảnh khác đã mất hết. gì có thể là vấn đề

Trả lời

53

Khi bạn chỉ định này:

TEMPLATE_CONTEXT_PROCESSORS = ('myapp.processor.foos',) 

Trong tập tin cài đặt, bạn đang trọng của Django default context processors. Để mở rộng danh sách, bạn cần phải bao gồm những cái mặc định trong cài đặt của bạn:

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth", 
    "django.core.context_processors.debug", 
    "django.core.context_processors.i18n", 
    "django.core.context_processors.media", 
    "myapp.processor.foos", 
) 

Lưu ý, các thiết lập ở trên là giá trị mặc định (cộng với bộ vi xử lý của bạn) cho django 1.1.

+0

Tôi kỳ lạ không có TEMPLATE_CONTEXT_PROCESSORS trong settings.py của mình, sử dụng Django 1.1.1 và media_url mặc định đã hoạt động tốt trước đó. – Hellnar

+5

Đó là bởi vì nếu bạn không chỉ định nó, nó sử dụng các giá trị mặc định được chỉ định trong cài đặt djangos. Đó là cách tất cả các cài đặt django hoạt động, chúng có mặc định sẽ được sử dụng nếu bạn không có nó trong 'settings.py'. –

+0

Cảm ơn bạn đã làm việc! Tôi đã nhận được lỗi vì vậy tôi loại bỏ "django.contrib.messages.context_processors.messages", Tôi nghĩ rằng đây là phiên bản phát triển của django, không 1.1.1 – Hellnar

6

Ở đây những gì làm việc cho tôi cho Django 1,3

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth", 
    "django.core.context_processors.debug", 
    "django.core.context_processors.i18n", 
    "django.core.context_processors.media", 
    "django.core.context_processors.static", 
    "django.contrib.messages.context_processors.messages", 
    "myapp.processor.foos",) 
173

Bạn cần phải thêm các giá trị mặc định của TEMPLATE_CONTEXT_PROCESSORS. Tuy nhiên, thay vì cứng mã hóa những giá trị đó, mà sẽ được gắn với một phiên bản cụ thể của Django, bạn có thể thêm bộ xử lý ngữ cảnh của bạn với các giá trị mặc định bằng cách như sau:

from django.conf import global_settings 
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    "myapp.processor.foos", 
) 

Hãy chắc chắn bao gồm dấu phẩy dấu trong tuple, để Python nhận ra nó như một bộ tuple.

+2

Cảm ơn mẹo này! Nó tốt hơn nhiều so với giải pháp điển hình hơn mà mọi người đề nghị như câu trả lời của TM ở đây. Có phải chỉ định toàn bộ các thiết lập mặc định chỉ để thêm một luôn luôn đánh tôi như một kludge, và chắc chắn nó đã trở lại với tôi tôi khi tôi nâng cấp lên django 1.3 và mọi thứ không hoạt động vì tôi thiếu bộ xử lý ngữ cảnh tĩnh mặc định. –

+8

Đây là câu trả lời tốt hơn, bởi vì nó sẽ vẫn hoạt động nếu các bộ xử lý mặc định thay đổi. – Canuck

+2

@Greg Glockner đó là một mẹo tuyệt vời, nhưng tôi nên thêm mã đó ở đâu? 'settings.py'? – dialex

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