reverse() 参数在 ** 后必须是映射类型

15 投票
2 回答
21400 浏览
提问于 2025-04-17 20:18

我有一个注册表单,但提交时不工作。

我遇到了这个错误:

reverse() 的参数必须是一个映射,而不是字符串

这是我的视图代码:

def inscription(request, seance_id):
    seance = get_object_or_404(Variant, id=seance_id)
    inscription_config = {'form_class': InscriptionForm,
                          'extra_context': {'seance': seance}}    

    return create_object(request, **inscription_config)

这是我的表单:

class InscriptionForm(forms.ModelForm):
    class Meta:
        model = Inscription
        
    def clean(self):
        cleaned_data = self.cleaned_data
        email = cleaned_data.get("mail")
        mail_confirmation = cleaned_data.get("mail_confirmation")
    
        if email != mail_confirmation:
            raise forms.ValidationError("Les deux adresses mails doivent correspondre")
    
        return cleaned_data

看起来触发这个错误的是返回语句中的 inscription_config,但我不知道为什么会这样。

编辑

环境信息:

请求方式:POST 请求网址: http://127.0.0.1:8039/formations/inscription/1/ Django 版本:1.2.5 Python 版本:2.7.2 已安装的应用程序:['django.contrib.auth', 'django.contrib.comments', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.admin', 'ckeditor', 'constance', 'constance.backends.database', 'custom_flatpages', 'django_extensions', 'django_mobile', 'django_xmlrpc', 'easy_thumbnails', 'gestion_formations', 'file_uploader', 'less', 'mptt', 'contact', 'newsletter', 'pagination', 'south', 'sentry', 'sentry.client', 'indexer', 'paging', 'contentadmin', 'gallerie'] 已安装的中间件:('annoying.middlewares.StaticServe', 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'pagination.middleware.PaginationMiddleware')

错误追踪信息:

文件 "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" 在 get_response 中 100. response = callback(request, callback_args, **callback_kwargs) 文件 "/home/anass/projects/c139_fc_finance/fc_finance/gestion_formations/views/carts.py" 在 inscription 中 24. form_class= InscriptionForm 文件 "/usr/local/lib/python2.7/dist-packages/django/views/generic/create_update.py" 在 create_object 中 118. return redirect(post_save_redirect, new_object) 文件 "/usr/local/lib/python2.7/dist-packages/django/views/generic/create_update.py" 在 redirect 中 65. return HttpResponseRedirect(obj.get_absolute_url()) 文件 "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py" 在 _curried 55. return _curried_func((args+moreargs), **dict(kwargs, **morekwargs)) 文件 "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py" 在 get_absolute_url 969. return settings.ABSOLUTE_URL_OVERRIDES.get('%s.%s' % (opts.app_label, opts.module_name), func)(self, *args, **kwargs) 文件 "/usr/local/lib/python2.7/dist-packages/django/db/models/init.py" 在 inner 32. return reverse(bits[0], None, *bits[1:3]) 文件 "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" 在 reverse 351. *args, **kwargs)))

异常类型:TypeError 在 /formations/inscription/1/ 异常值:reverse() 的参数必须是一个映射,而不是字符串

2 个回答

3

调皮的逗号

return redirect(reverse_lazy('team-detail', kwargs={'pk', team.pk}))

应该是

return redirect(reverse_lazy('team-detail', kwargs={'pk': team.pk}))
19

我来回答一下,因为我之前也遇到过这个问题,但在网上没找到答案。

我觉得这个问题的根源在于 get_absolute_url(...) 方法写错了。比如,如果你这样写:

@models.permalink
def get_absolute_url(self):
    return reverse('my_named_url', kwargs={ "pk": self.pk })

那么就会出现一个错误,提示 reverse() argument after ** must be a mapping, not str。解决这个问题的方法是去掉 @models.permalink 装饰器,像这样:

def get_absolute_url(self):
    return reverse('my_named_url', kwargs={ "pk": self.pk })

或者你也可以保留这个装饰器,但需要修改里面的内容,像这样:

@models.permalink
def get_absolute_url(self):
    return ('my_named_url', (), { "pk": self.pk })

不过我觉得后者已经不推荐使用了。

撰写回答