3

我从 1.10.7 更新到 1.11.0,查看表单时出现以下错误。我根本无法理解我的表格有什么问题。其他形式的工作方式相同。我怀疑这可能是与select2markdownx的交互,但没有迹象表明它们与 1.11 不兼容。

我该如何进一步调试呢?

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
  23.                 return view_func(request, *args, **kwargs)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
  23.                 return view_func(request, *args, **kwargs)

File "/home/usr/repos/intranet/isotek_intranet_site/order_book/views.py" in create
  161.     return render(request, 'order_book/create.html', context)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/shortcuts.py" in render
  30.     content = loader.render_to_string(template_name, context, request, using=using)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/template/loader.py" in render_to_string
  68.     return template.render(context, request)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/template/backends/django.py" in render
  66.             return self.template.render(context)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/template/base.py" in render
  207.                     return self._render(context)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/template/base.py" in _render
  199.         return self.nodelist.render(context)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  177.             return compiled_parent._render(context)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/template/base.py" in _render
  199.         return self.nodelist.render(context)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  72.                 result = block.nodelist.render(context)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/template/base.py" in render
  1046.         return render_value_in_context(output, context)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/template/base.py" in render_value_in_context
  1024.     value = force_text(value)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/utils/encoding.py" in force_text
  78.                 s = six.text_type(s)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/utils/html.py" in <lambda>
  376.         klass.__unicode__ = lambda self: mark_safe(klass_unicode(self))

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/forms/boundfield.py" in __str__
  41.         return self.as_widget()

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/forms/boundfield.py" in as_widget
  120.             **kwargs

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/forms/widgets.py" in render
  220.         context = self.get_context(name, value, attrs)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/forms/widgets.py" in get_context
  665.         context = super(Select, self).get_context(name, value, attrs)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/forms/widgets.py" in get_context
  626.         context = super(ChoiceWidget, self).get_context(name, value, attrs)

File "/home/usr/.virtualenvs/intranet/lib/python2.7/site-packages/django/forms/widgets.py" in get_context
  211.             'attrs': self.build_attrs(self.attrs, attrs),

Exception Type: TypeError at /order_book/create/
Exception Value: build_attrs() takes at most 2 arguments (3 given)

模板:

<form action="/order_book/invoice/create/" method="post">
{% csrf_token %}
<input type='hidden' name='action' value='create'>

<table>
    <tr>
        <td>{{ form.active.label }}</td>
        <td>{{ form.active }}</td>
    </tr>
    <!-- other entries like the one above… -->
    <tr>
        <td>
            <button type="submit" value="Add"><img src="/static/images/tick.png" alt="Set">
                Create new project code</button>
        </td>
    </tr>
</table>

风景:

def create_code(request):  # pragma: no cover
    context = {}
    if request.method == 'POST':
        form = MyForm(request.POST)
        if form.is_valid():
            pass  # Clearly for testing…
    form = MyForm()
    context['form'] = form
    return render(request, 'order_book/create_code.html', context)

表格:

class MyForm(forms.ModelForm):

    class Meta:
        model = MyModel
        fields = '__all__'
        widgets = {
           'manager': Select2Widget(attrs={'style': 'min-width:400px'}),
        }
4

2 回答 2

1

他们更改了 Django 1.11 中的 build_attrs 函数/

您可能还需要使用 pip 升级 select2 和 markdownx。

pip install select2 markdownx --upgrade

于 2017-04-25T15:10:34.467 回答
0

在 Django 1.11 更新中,他们将 build_attrs 类更改为仅使用 2 个参数,所有额外的参数现在都应该在 dict 中传递。

因此,当您使用使用 build_attrs 函数的自定义小部件时,您需要更改 build_attrs 调用:

build_attrs(attrs, foo='bizz', bar='baz')

至:

build_attrs(attrs, {'foo':'bizz', 'bar':'baz'})

因此罪魁祸首是 Select2 类。您可以通过超类化并使用新方法覆盖渲染函数来自己修复它,或者您可以检查作者是否有更新。

于 2017-06-03T22:05:50.007 回答