在django表单中使用reverse() [英] Using reverse() in django forms

查看:115
本文介绍了在django表单中使用reverse()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用django的 reverse()功能定义django表单为我的自定义小部件,但我收到一个错误:

 不正确的配置
包含的urlconf网址没有

这里是代码:



pre> class WorkForm(forms.Form):
#...
category = forms.ChoiceField(
required = True,
label = _('Category'),
help_text = _('为你的工作选择最合适的类别')

subcategory = forms.ChoiceField(
widget = DependantChoiceWidget (
default_value = _('Select category first'),
data_source_url = reverse('works-json-categories'),
#data_source_url ='' b $ b depends_on ='category_id'
),
requ ired = True,
label = _('SubCategory'),
help_text = _('哪个子类适合你的工作最好')

我很确定,我的'works.urls'配置正确,因为所有其他页面都按预期工作。



是否有原因,为什么我不能在表单定义中使用 reverse()?与代码运行有关吗?有没有办法解决这个问题,或者唯一的选择是硬编码URL?



这是完整的错误转储:

 环境:

请求方法:GET
请求URL:http://127.0.0.1:8000/works/add?category = 1& subcategory = 1

Django版本:1.4 pre-alpha
Python版本:2.7.1
安装的应用程序:
['django.contrib.auth' ,
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'django.contrib.admindocs',
'social_auth',
'sorl。
'help',
'users',
'works',
'debug_toolbar']
安装的中间件:
('django。 middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.transaction.TransactionMid dleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'debug_toolbar.middleware.DebugToolbarMiddleware')


追溯:
文件/usr/local/lib/python2.7/dist-packages/django/core/ get_response中的处理程序/ base.py
89. response = middleware_method(request)
文件/usr/local/lib/python2.7/dist-packages/django/middleware/common.py process_request
67.如果(不是_is_valid_path(request.path_info,urlconf)和
文件/usr/local/lib/python2.7/dist-packages/django/middleware/common.py在_is_valid_path
164. urlresolvers.resolve(path,urlconf)
解析
416中的/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py文件。return get_resolver(urlconf).resolve(path)
文件/usr/local/lib/python2.7/dist-packages/django/core/urlr esolvers.py解析
298.对于self.url_patterns中的模式:
文件/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py在url_patterns
328. patterns = getattr(self.urlconf_module,urlpatterns,self.urlconf_module)
文件/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py in urlconf_module
323. self._urlconf_module = import_module(self.urlconf_name)
import_module中的/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py文件
35. __import __(name)
< module>中的文件/var/www/megenius/trunk/urls.py
27. url(r'^ works /',include('works.urls')),
文件/usr/local/lib/python2.7/dist-packages/django/conf/ urls / __ init__.pyin include
24. urlconf_module = import_module(urlconf_module)
文件/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py在import_module
35. __import __(name)
< module>中的文件/var/www/megenius/trunk/works/urls.py
2.从works.views import *
文件/var/www/megenius/trunk/works/views.py在< module>
9.从works.forms导入WorkForm
< module>中的文件/var/www/megenius/trunk/works/forms.py
10. WorkForm(forms.Form):
WorkForm中的文件/var/www/megenius/trunk/works/forms.py
31. data_source_url = reverse('works- json-categories'),
文件/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py反向
473.(prefix,resolver.reverse(查看,* args,** kwargs)))
文件/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py反向
360.可能性= self.reverse_dict.getlist(lookup_view)
文件/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.pyin reverse_dict
276. self._populate()
文件/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py在_populate
242.对于反向(self.url_patterns)中的模式:
文件/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py在url_patterns
332. raise不正确的配置(包含的urlconf%s没有任何其中的模式%self.urlconf_name

异常类型:/ works / add
异常配置异常值:包含的urlconf url中没有任何模式


解决方案

问题可能是表单在加载网址之前定义。



Django 1.4将有一个 reverse_lazy 功能可以解决这个问题。您可以自己在项目中实施(请参见更改集16121 )。



或者,您可以在窗体 __ init __ 方法中设置窗口小部件。然后在url加载后,创建表单时,反向调用。

  class WorkForm(forms.Form):
#...
subcategory = forms.ChoiceField(
required = True,
label = _('SubCategory'),
help_text = _('哪个子类适合你的工作最好')

def __init __(self,* args,** kwargs):
super(WorkForm,self).__ init __(* args,** kwargs)
self.fields ['subcategory']。widget = DependantChoiceWidget(
default_value = _('Select category first'),
data_source_url = reverse('works-json-categories'),
depends_on ='category_id'
),


I'm trying to use django's reverse() function in definition of django form for my custom widget, but am getting an error:

ImproperlyConfigured
The included urlconf urls doesn't have any patterns in it

Here is the code:

class WorkForm(forms.Form):
    # ...
    category = forms.ChoiceField(
        required=True,
        label=_('Category'),
        help_text=_('Select most appropriate category for your work.')
    )
    subcategory = forms.ChoiceField(
        widget=DependantChoiceWidget(
            default_value=_('Select category first'),
            data_source_url=reverse('works-json-categories'),
            # data_source_url='', -- it works this way
            depends_on='category_id'
        ),
        required=True,
        label=_('SubCategory'),
        help_text=_('Which subcategory suits your work best.')
    )

I am pretty sure, that my 'works.urls' is configured properly, since all other pages work as expected.

Is there a reason, why I cannot use reverse() in form definition? Does it have something to do with when this code runs? Is there a way to fix this, or the only choice here is to hardcode the URL?

Here is full error dump:

Environment:

Request Method: GET
Request URL: http://127.0.0.1:8000/works/add?category=1&subcategory=1

Django Version: 1.4 pre-alpha
Python Version: 2.7.1
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'django.contrib.admindocs',
 'social_auth',
 'sorl.thumbnail',
 'helpers',
 'users',
 'works',
 'debug_toolbar']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.transaction.TransactionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'debug_toolbar.middleware.DebugToolbarMiddleware')


Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  89.                     response = middleware_method(request)
File "/usr/local/lib/python2.7/dist-packages/django/middleware/common.py" in process_request
  67.             if (not _is_valid_path(request.path_info, urlconf) and
File "/usr/local/lib/python2.7/dist-packages/django/middleware/common.py" in _is_valid_path
  164.         urlresolvers.resolve(path, urlconf)
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in resolve
  416.     return get_resolver(urlconf).resolve(path)
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in resolve
  298.             for pattern in self.url_patterns:
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in url_patterns
  328.         patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in urlconf_module
  323.             self._urlconf_module = import_module(self.urlconf_name)
File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py" in import_module
  35.     __import__(name)
File "/var/www/megenius/trunk/urls.py" in <module>
  27.     url(r'^works/', include('works.urls')),
File "/usr/local/lib/python2.7/dist-packages/django/conf/urls/__init__.py" in include
  24.         urlconf_module = import_module(urlconf_module)
File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py" in import_module
  35.     __import__(name)
File "/var/www/megenius/trunk/works/urls.py" in <module>
  2. from works.views import *
File "/var/www/megenius/trunk/works/views.py" in <module>
  9. from works.forms import WorkForm
File "/var/www/megenius/trunk/works/forms.py" in <module>
  10. class WorkForm(forms.Form):
File "/var/www/megenius/trunk/works/forms.py" in WorkForm
  31.             data_source_url=reverse('works-json-categories'),
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in reverse
  473.                       (prefix, resolver.reverse(view, *args, **kwargs)))
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in reverse
  360.         possibilities = self.reverse_dict.getlist(lookup_view)
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in reverse_dict
  276.             self._populate()
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in _populate
  242.         for pattern in reversed(self.url_patterns):
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in url_patterns
  332.             raise ImproperlyConfigured("The included urlconf %s doesn't have any patterns in it" % self.urlconf_name)

Exception Type: ImproperlyConfigured at /works/add
Exception Value: The included urlconf urls doesn't have any patterns in it

解决方案

The problem might be that the form is defined before the urls have been loaded.

Django 1.4 will have a reverse_lazy feature that would solve this problem. You could implement it in your project yourself (see changeset 16121).

Alternatively, you could set the widget in your forms __init__ method instead. Then the reverse call happens when the form is created, after the urls have loaded.

class WorkForm(forms.Form):
    # ...
    subcategory = forms.ChoiceField(
        required=True,
        label=_('SubCategory'),
        help_text=_('Which subcategory suits your work best.')
    )
    def __init__(self, *args, **kwargs):
        super(WorkForm, self).__init__(*args, **kwargs)
        self.fields['subcategory'].widget=DependantChoiceWidget(
            default_value=_('Select category first'),
            data_source_url=reverse('works-json-categories'),
            depends_on='category_id'
        ),

这篇关于在django表单中使用reverse()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆