2009-08-13 32 views
52

Bạn có biết nếu nó có thể biết trong một mẫu django nếu cờ TEMPLATE_DEBUG được thiết lập?Cách kiểm tra cờ TEMPLATE_DEBUG trong mẫu django?

Tôi muốn tắt tập lệnh phân tích google của mình khi tôi đang chạy ứng dụng django trên máy phát triển của mình. Một cái gì đó giống như một thẻ mẫu {% if debug%} sẽ là hoàn hảo. Thật không may, tôi đã không tìm thấy một cái gì đó như thế trong tài liệu.

Để chắc chắn, tôi có thể thêm cờ này vào ngữ cảnh nhưng tôi muốn biết nếu có cách nào tốt hơn để làm điều đó.

+2

Câu trả lời dưới đây được khấu hao. Bây giờ với django bạn có thể làm cho nó đơn giản hơn nhiều: http://stackoverflow.com/questions/25783459/how-to-check-debug-true-false-in-django-template-exactly-in-layout-html/25783860# 25783860 – andi

Trả lời

61

Giả sử bạn chưa đặt TEMPLATE_CONTEXT_PROCESSORS thành một số giá trị khác trong settings.py, Django sẽ tự động nạp tiền xử lý ngữ cảnh debug (như đã ghi chú here). Điều này có nghĩa rằng bạn sẽ có quyền truy cập vào một biến gọi là debug trong các mẫu của bạn nếusettings.DEBUG là đúng địa chỉ IP máy của địa phương (trong đó chỉ có thể là 127.0.0.1) được thiết lập trong biến settings.INTERNAL_IPS (được mô tả here) . settings.INTERNAL_IPS là một bộ tuple hoặc danh sách các địa chỉ IP mà Django sẽ nhận ra là "nội bộ".

+2

Nó có vẻ tương ứng với nhu cầu của tôi nhưng tiếc là nó không hoạt động cho tôi. Tôi không thể tìm thấy những gì là sai. – luc

+8

Điều đó hoạt động hoàn hảo miễn là tôi sử dụng một RequestContext thay vì một Context. Cảm ơn rất nhiều! – luc

+2

Rất tiếc, xin lỗi! Tôi đã quên đề cập đến rằng bạn phải vượt qua một 'RequestContext' cho mẫu. – mipadi

0

Bạn sẽ cần thêm cờ DEBUG vào số context_processors của mình.

Thậm chí có thể không còn cách nào khác. Ít nhất, không ai mà tôi biết.

5

Nếu bạn chưa làm như vậy, nó luôn giúp xem liệu người khác có xử lý cùng một vấn đề trên djangosnippets hay không. Đoạn mã gần đây nhất hoạt động với thẻ phân tích là 1656: http://www.djangosnippets.org/snippets/1656/

Điều tuyệt vời về giải pháp này là cho phép bạn giữ GOOGLE_ANALYTICS_CODE = xxxxxx trong local_settings.py trong trường hợp nguồn của bạn được công khai, khóa của bạn vẫn là riêng tư . Ngoài ra, đi thêm một bước để không sử dụng phân tích cho người dùng đã đăng nhập.

Bao gồm Javascript cho Google Analytics. Sẽ không hiển thị mã Google Analytics khi DEBUG được bật hoặc cho người dùng nhân viên.

Sử dụng {% googleanalyticsjs %} trong mẫu của bạn.

Bạn phải thiết lập một cái gì đó giống như

GOOGLE_ANALYTICS_CODE = "UA-1234567-1" 

trong tập tin cài đặt.

Giả 'người dùng trong các biến mẫu của bạn là request.user, mà nó sẽ được nếu bạn sử dụng:

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

(Giả sử django.core.context_processors.auth là trong TEMPLATE_CONTEXT_PROCESSORS, mà nó là theo mặc định)


from django import template 
import settings 
register = template.Library() 


class ShowGoogleAnalyticsJS(template.Node): 
    def render(self, context): 
     code = getattr(settings, "GOOGLE_ANALYTICS_CODE", False) 
     if not code: 
      return "<!-- Goggle Analytics not included because you haven't set the settings.GOOGLE_ANALYTICS_CODE variable! -->" 

     if 'user' in context and context['user'] and context['user'].is_staff: 
      return "<!-- Goggle Analytics not included because you are a staff user! -->" 

     if settings.DEBUG: 
      return "<!-- Goggle Analytics not included because you are in Debug mode! -->" 

     return """ 
     <script type="text/javascript"> 
      var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); 
      document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' 
      type='text/javascript'%3E%3C/script%3E")); 
     </script> 
     <script type="text/javascript"> 
      try { 
      var pageTracker = _gat._getTracker('""" + str(code) + """'); 
      pageTracker._trackPageview(); 
     } catch(err) {}</script> 
     """ 

def googleanalyticsjs(parser, token): 
    return ShowGoogleAnalyticsJS() 

show_common_data = register.tag(googleanalyticsjs) 
+0

Đối với tôi, đây là giải pháp hoàn hảo .. –

49

Nếu sửa đổi INTERNAL_IPS là không thể/phù hợp, bạn có thể thực hiện việc này th một bộ xử lý ngữ cảnh:

trong myapp/context_processors.py:

from django.conf import settings 

def debug(context): 
    return {'DEBUG': settings.DEBUG} 

trong settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
    ... 
    'myapp.context_processors.debug', 
) 

Sau đó, trong các mẫu của tôi, chỉ cần:

{% if DEBUG %} .header { background:#f00; } {% endif %} 
+0

Tôi không tìm thấy bất kỳ tài liệu nào cho điều này, và nó dường như không cần thiết trước khi django 1.6 .. Tôi tìm thấy điều này một chút cũ, bất kỳ lời giải thích? Tôi có cần tải bất kỳ cài đặt cụ thể nào cho ngữ cảnh không? Đây không phải là rất conveniant tôi nghĩ rằng .. Cảm ơn cho các tip mặc dù –

14

Django 1,9settings.py:

INTERNAL_IPS = (
    '127.0.0.1', 
) 

Templates:

{% if debug %} 

https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-INTERNAL_IPS nói:

Một danh sách các địa chỉ IP, như dây đàn, rằng:

  • Cho phép debug() xử lý ngữ cảnh để thêm một số biến vào ngữ cảnh mẫu.

Bộ xử lý bối cảnh debug là trong mặc định settings.py.

+0

Đây có phải là một giải pháp tốt hay đúng hơn là một giải pháp hacky? –

+0

@ ÖzerS. toàn bộ Django được cho là một hack! :-) (Tôi nghĩ rằng đó là tốt nhưng tôi không phải 100%) –

4

{% if debug %} có thể thực hiện thủ thuật nhưng chỉ khi bạn vượt qua RequestContext thay vì Context. Ngoài ra, debug không phải là cờ boolean, đó là một hàm mà khi được đánh giá trong khi DEBUG = True trả lại một số thông tin gỡ lỗi. Đây có thể là chi phí không cần thiết cho mẫu của bạn.

Cá nhân, tôi thực hiện thủ thuật này thay thế.

{% if request.META.HTTP_HOST == "127.0.0.1:8000" %} 

Điều này sẽ luôn hoạt động nhưng thay vì dựa vào cả cờ DEBUG và INTERNAL_IP, nó chỉ hoạt động đối với IP được mã hóa cứng.

+0

Tốt hơn để di chuyển nó vào thẻ mẫu với 'takes_context = True' để không vi phạm DRY. – arogachev

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