2013-02-01 25 views
5

Tôi có một lỗi sử dụng get_or_create trên queryset:Django QuerySet get_or_create - TypeError - save() có một cuộc tranh cãi từ khóa bất ngờ 'sử dụng'

TypeError tại ... save() có một cuộc tranh cãi từ khóa bất ngờ 'sử dụng'

Đây là quan điểm của tôi:

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',) 

và đây là toàn bộ traceback:

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' 

Trả lời

4

Thay đổi của bạn save như thế này có giải quyết vấn đề

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) 

Như Daniel nói, có vẻ như bạn đã làm điều gì đó tương tự như mô hình Subscriber (mà bạn đã không được đăng). Tôi khuyên bạn nên thực hiện việc thêm super() tương tự ở đó nếu bạn chưa thêm. Cuộc gọi super sẽ chỉ gọi cho phụ huynh save() sau khi hoàn thành (hoặc trước đó nếu ở đầu hàm) mã lưu tùy chỉnh của bạn.

15

Bạn đã ghi đè định nghĩa của save trong mô hình Subscriber mà bạn không hiển thị, mà không cho phép danh sách đầy đủ các thông số. Bạn phải luôn hỗ trợ *args, **kwargs trong các phương pháp ghi đè và chuyển chúng vào cuộc gọi super().

Mặc dù nó không phải là nguyên nhân của vấn đề này, điều này cũng đúng với phương thức lưu biểu mẫu của bạn, không hỗ trợ các đối số như commit. Một lần nữa, chấp nhận *args, **kwargs. Và chắc chắn gọi phương thức super ở đây, mà bạn hiện không làm.

+0

Giải pháp của bạn đã thực hiện thủ thuật cho tôi, cảm ơn rất nhiều! –

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