6

我在查询集上使用get_or_create时出错:

TypeError at ...save()得到了一个意外的关键字参数“使用”

这是我的看法:

class MailingListSubscriptionForm(forms.ModelForm):
    """Form for subscribing to a mailing list"""
    # Notes : This form will not check the uniquess of
    # the 'email' field, by defining it explictly and setting
    # it the Meta.exclude list, for allowing registration
    # to a mailing list even if the contact already exists.
    # Then the contact is always added to the subscribers field
    # of the mailing list because it will be cleaned with no
    # double.

    email = forms.EmailField(label=_('Email'), max_length=75)

    def save(self, mailing_list):
        data = self.cleaned_data
        contact, created = Subscriber.objects.get_or_create(
            email__exact=data['email'], defaults={'email': data['email']}
        )

        mailing_list.subscribers.add(contact)
        mailing_list.unsubscribers.remove(contact)

    class Meta:
        model = Subscriber
        fields = ('email',)

这是完整的追溯:

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/home/newsletter/

Django Version: 1.4.3
Python Version: 2.7.3
Installed Applications:
('jmb.core',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'south',
 'easy_thumbnails',

 'web',
 'sccore.profiles',
 'django.contrib.admin',
 'django_extensions',

 'cms',
 'mptt',
 'menus',
 'south',
 'sekizai',
 'cms.plugins.flash',
 'cms.plugins.googlemap',
 'cms.plugins.link',
 'cms.plugins.snippet',
 'cms.plugins.text',
 'cms.plugins.twitter',
 'filer',
 'cmsplugin_filer_file',
 'cmsplugin_filer_folder',
 'cmsplugin_filer_image',
 'cmsplugin_filer_teaser',
 'cmsplugin_filer_video',
 'easy_thumbnails',
 'tinymce',

 'debug_toolbar',
 'django_extensions')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'jmb.core.middleware.thread_local.ThreadLocals',
 'cms.middleware.multilingual.MultilingualURLMiddleware',
 'cms.middleware.page.CurrentPageMiddleware',
 'cms.middleware.user.CurrentUserMiddleware',
 'cms.middleware.toolbar.ToolbarMiddleware',
 'debug_toolbar.middleware.DebugToolbarMiddleware')


Template error:
In template /home/luca/src/jmb-siti/www.acomea.it/web/templates/bootstrap_full.html, error at line 12
   save() got an unexpected keyword argument 'using'
   2 : {% load cms_tags menu_tags sekizai_tags %}


   3 : 


   4 : {% block central_content_left %}{% endblock %}


   5 : {% block central_content %}


   6 : <div class="span9 central_content">


   7 :     <div class="row-fluid">


   8 :         {% block central_content_central %}


   9 :         {% block central_content_central_top %}{% endblock %}


   10 :         {% block central_content_central_middle %}


   11 :         <div class="span12 central_content_central_middle"><div class="item6 height5">


   12 :              {% placeholder central_content_central_middle %} 


   13 :         </div></div>


   14 :         {% endblock %}


   15 :         {% block central_content_central_bottom %}{% endblock %}


   16 :         {% endblock %}


   17 :     </div>


   18 : </div>


   19 : {% endblock %}


   20 : {% block central_content_right %}{% endblock %}


   21 : 


   22 : {% block central_right %}{% endblock %}


Traceback:
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/luca/.buildout/eggs/django_cms-2.3.3-py2.7.egg/cms/views.py" in details
  113.     return render_to_response(template_name, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/shortcuts/__init__.py" in render_to_response
  20.     return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/loader.py" in render_to_string
  171.         return t.render(Context(dictionary))
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  140.             return self._render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/test/utils.py" in instrumented_test_render
  62.     return self.nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/loader_tags.py" in render
  123.         return compiled_parent._render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/test/utils.py" in instrumented_test_render
  62.     return self.nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/loader_tags.py" in render
  123.         return compiled_parent._render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/test/utils.py" in instrumented_test_render
  62.     return self.nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/django_classy_tags-0.3.4.1-py2.7.egg/classytags/core.py" in render
  102.         return self.render_tag(context, **kwargs)
File "/home/luca/.buildout/eggs/django_sekizai-0.6.1-py2.7.egg/sekizai/templatetags/sekizai_tags.py" in render_tag
  75.         rendered_contents = nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/django_classy_tags-0.3.4.1-py2.7.egg/classytags/core.py" in render
  102.         return self.render_tag(context, **kwargs)
File "/home/luca/.buildout/eggs/django_cms-2.3.3-py2.7.egg/cms/templatetags/cms_tags.py" in render_tag
  235.         content = get_placeholder_content(context, request, page, name, inherit)
File "/home/luca/.buildout/eggs/django_cms-2.3.3-py2.7.egg/cms/templatetags/cms_tags.py" in get_placeholder_content
  154.         content = render_placeholder(placeholder, context, name)
File "/home/luca/.buildout/eggs/django_cms-2.3.3-py2.7.egg/cms/plugin_rendering.py" in render_placeholder
  126.     content.extend(render_plugins(plugins, context, placeholder, processors))
File "/home/luca/.buildout/eggs/django_cms-2.3.3-py2.7.egg/cms/plugin_rendering.py" in render_plugins
  80.         out.append(plugin.render_plugin(context, placeholder, processors=processors))
File "/home/luca/.buildout/eggs/django_cms-2.3.3-py2.7.egg/cms/models/pluginmodel.py" in render_plugin
  171.             context = plugin.render(context, instance, placeholder_slot)
File "/home/luca/src/jumbo2/jmb.newsletter/jmb/newsletter/cms/plugins.py" in render
  27.                 form.save(instance.mailing_list)
File "/home/luca/src/jumbo2/jmb.newsletter/jmb/newsletter/forms.py" in save
  27.             email__exact=data['email'], defaults={'email': data['email']}
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/db/models/manager.py" in get_or_create
  134.         return self.get_query_set().get_or_create(**kwargs)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/db/models/query.py" in get_or_create
  452.                 obj.save(force_insert=True, using=self.db)

Exception Type: TypeError at /home/newsletter/
Exception Value: save() got an unexpected keyword argument 'using'
4

2 回答 2

17

您已经覆盖了模型中未显示的定义saveSubscriber而不允许完整的参数列表。您应该始终支持*args, **kwargs覆盖的方法,并将它们传递给super()调用。

尽管这不是导致此问题的原因,但您的表单保存方法也是如此,它不支持commit. 再次,接受*args, **kwargs。并且绝对在super这里调用该方法,您目前没有这样做。

于 2013-02-01T11:22:09.420 回答
5

像这样改变你save可能会解决问题

def save(self, mailing_list, *args, **kwargs):
    data = self.cleaned_data
    contact, created = Subscriber.objects.get_or_create(
        email__exact=data['email'], defaults={'email': data['email']}
    )

    mailing_list.subscribers.add(contact)
    mailing_list.unsubscribers.remove(contact)

    super(MailingListSubscriptionForm, self).save(*args, **kwargs)

正如丹尼尔所说,看起来你已经做了类似于Subscriber模型的事情(你没有发布)。super()如果您还没有,我建议您在那里进行类似的添加。一旦完成(或在函数开始之前)您的自定义保存代码,该super调用将只调用父级。save()

于 2013-02-01T11:19:55.367 回答