2015-07-19 40 views
1

我的代碼返回而不是空字符串我以前調用的值。我該如何解決這個問題?django:模板標籤返回而不是先前調用的空字符串值

模板標籤:

from django.template import Library, Node, resolve_variable 
from django.utils.safestring import SafeText 
from django.http import QueryDict 

register = Library() 

""" 
The tag generates a parameter string in form '?param1=val1&param2=val2'. 
The parameter list is generated by taking all parameters from current 
request.GET and optionally overriding them by providing parameters to the tag. 

This is a cleaned up version of http://djangosnippets.org/snippets/2105/. It 
solves a couple of issues, namely: 
""" 

class AddGetParameter(Node): 
    def __init__(self, values): 
     self.values = values 

    def render(self, context): 
     req = resolve_variable('request', context) 
     params = req.GET.copy() 

     for key, value in self.values.items(): 
      parameterValue=value.resolve(context) 

      if value == "" and type(parameterValue) is SafeText and len(parameterValue) == 0 and key in params: 
       del params[key] 
      else: 
       params[key] = parameterValue 

     resultDict=dict() 
     for key in params: 
      if len(str(params[key]))>0: 
       resultDict[key]=params[key] 

     qdict = QueryDict('', mutable=True) 
     qdict.update(resultDict) 

     urlString=qdict.urlencode() 
     print urlString 

     if len(urlString) > 0: 
      return '?%s' % urlString 
     else: 
      return '' 

@register.tag 
def add_get(parser, token): 
    pairs = token.split_contents()[1:] 
    values = {} 
    for pair in pairs: 
     s = pair.split('=', 1) 
     values[s[0]] = parser.compile_filter(s[1]) 
    return AddGetParameter(values) 

注:我已經修改了代碼段,使其從沒有被設置爲「」的URL刪除變量。

template.html:

{% load add_get_parameter %} 
<a href="{% add_get location="7" %}">set</a> 
<a href="{% add_get location="" %}">empty</a> 

結果:

<a href="?location=7">set</a> 
<a href="?location=7">empty</a> 

萬一我改變與return ''return "?"行,那麼結果是:

<a href="?location=7">set</a> 
<a href="?">empty</a> 

但我怎麼能得到一個字符串沒有任何東西(字符串長度爲0)?我究竟做錯了什麼?

UPDATE settings.py:

# Django settings for Roadrunners project. 
from django.core.urlresolvers import reverse_lazy 
import djcelery 

djcelery.setup_loader() 
import os 
from django.utils.translation import ugettext_lazy as _ 

gettext = lambda s: s 
PROJECT_PATH = os.path.split(os.path.abspath(os.path.dirname(__file__)))[0] 
APPLICATION_PATH=os.path.abspath('.') 


DEBUG = True 
TEMPLATE_DEBUG = DEBUG 

MANAGERS = ADMINS 

DATABASES = { 
     'default': { 
      'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 
      'NAME': os.path.join(PROJECT_PATH, 'database.sqlite'),      # Or path to database file if using sqlite3. 
      # The following settings are not used with sqlite3: 
      'USER': '', 
      'PASSWORD': '', 
      'HOST': '',      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP. 
      'PORT': '',      # Set to empty string for default. 
     } 
} 
ALLOWED_HOSTS = ['127.0.0.1', 'localhost'] 
TIME_ZONE = 'Europe/Vienna' 
LANGUAGE_CODE = 'de' 

ugettext = lambda s: s 
LANGUAGES = [ 
    ('de', gettext('Deutsch')), 
    ('en', gettext('English')), 
] 

SITE_ID = 1 

USE_I18N = True 
USE_L10N = True 
USE_TZ = False 
MEDIA_ROOT = os.path.join(PROJECT_PATH, "media").replace('\\','/') 
MEDIA_URL = '/media/' 
STATIC_ROOT = '' 
STATIC_URL = '/static/' 

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
) 

SECRET_KEY = '**REMOVED**' 

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 
) 

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'crequest.middleware.CrequestMiddleware', 

    'debug_toolbar.middleware.DebugToolbarMiddleware', 
) 

ROOT_URLCONF = 'Roadrunners.urls' 

WSGI_APPLICATION = 'Roadrunners.wsgi.application' 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.admin', 
    'autoslug', 
    'debug_toolbar', 
    'easy_thumbnails', 
    'crispy_forms', 
    'VariousHelpers', 
    'django_filters', 
    'VerifiedDocuments', 
    'VMS', 
    'django_countries', 
    'multiselectfield', 
    'django_tables2', #// probleme mit 1.8 
    'django_select2', #// probleme mit 1.8 
    'mathfilters', 
    'crequest', 
    'Events', 
    'Place', 
    'data_importer', # // probleme mit 1.8 
) 

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer' 

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'filters': { 
     'require_debug_false': { 
      '()': 'django.utils.log.RequireDebugFalse' 
     } 
    }, 
    'handlers': { 
     'mail_admins': { 
      'level': 'ERROR', 
      'filters': ['require_debug_false'], 
      'class': 'django.utils.log.AdminEmailHandler' 
     } 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': True, 
     }, 
    } 
} 
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.core.context_processors.tz", 
    "django.contrib.messages.context_processors.messages", 
    "django.core.context_processors.request", 
) 

#TEMPLATE_DIRS = (os.path.join(os.path.dirname(__file__), '..', 'templates').replace('\\','/'),) 
TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
    os.path.join(PROJECT_PATH, "templates"), 
    os.path.join(APPLICATION_PATH, "Place"), 
    os.path.join(APPLICATION_PATH, "VerifiedDocuments"), 
    os.path.join(APPLICATION_PATH, "Events"), 
) 

LOGIN_REDIRECT_URL = reverse_lazy('inside') 
LOGIN_URL = reverse_lazy('login') 
DEFAULT_FROM_EMAIL='******REMOVED******' 

THUMBNAIL_PROCESSORS = (
    'easy_thumbnails.processors.colorspace', 
    'easy_thumbnails.processors.autocrop', 
    'easy_thumbnails.processors.scale_and_crop', 
    'easy_thumbnails.processors.filters', 
    'easy_thumbnails.processors.background', 
) 

CRISPY_TEMPLATE_PACK = 'bootstrap3' 

INTERNAL_IPS = ('127.0.0.1',) 

DEBUG_TOOLBAR_PANELS = (
    'debug_toolbar.panels.versions.VersionsPanel', 
    'debug_toolbar.panels.timer.TimerPanel', 
    'debug_toolbar.panels.settings.SettingsPanel', 
    'debug_toolbar.panels.headers.HeadersPanel', 
    'debug_toolbar.panels.request.RequestPanel', 
    'debug_toolbar.panels.sql.SQLPanel', 
    'debug_toolbar.panels.staticfiles.StaticFilesPanel', 
    'debug_toolbar.panels.templates.TemplatesPanel', 
    'debug_toolbar.panels.cache.CachePanel', 
    'debug_toolbar.panels.signals.SignalsPanel', 
    'debug_toolbar.panels.logging.LoggingPanel', 
    'debug_toolbar.panels.redirects.RedirectsPanel', 
) 

def custom_show_toolbar(request): 
    return True 

DEBUG_TOOLBAR_CONFIG = { 
    'INTERCEPT_REDIRECTS': False, 
    'SHOW_TOOLBAR_CALLBACK': custom_show_toolbar, 
    #'EXTRA_SIGNALS': ['myproject.signals.MySignal'], 
    'HIDE_DJANGO_SQL': False, 
    'TAG': 'div', 
} 


SELECT2_BOOTSTRAP = True 
GENERATE_RANDOM_SELECT2_ID = True 

TEST_RUNNER = 'django.test.runner.DiscoverRunner' 

回答

0

這實際上對我的作品,我得到:

<a href="?location=7">set</a> 
<a href="">empty</a> 

我懷疑你可能有一些模板緩存(塊高速緩存)。如果沒有,那麼也許其他一些奇怪的東西正在混淆你的請求。做一個調試打印,看看它告訴你什麼,它運行多少次:

def render(self, context): 
    req = resolve_variable('request', context) 
    params = req.GET.copy() 
    print "----" 
    print "\n".join("{}:{}".format(k, v) for k, v in params.items()) 
    print "----" 
+0

謝謝你的回答和測試。 調試打印運行2次,並從url返回位置參數。 我沒有在模板中使用緩存(除了通過使用擴展標籤來應用它)。 此外我已經添加了我的settings.py文件。也許這有幫助。 – user3316786

相關問題