TypeError build_attrs()在Django中获得了意外的关键字参数'id'

时间:2019-02-28 15:05:02

标签: django typeerror

通常,什么会导致build_attrs()收到意外的关键字参数'id'错误?

尤其是在我的项目从一台服务器迁移到另一台服务器后,我会遇到此错误。所有模板都呈现得很好。 我不知道在哪里搜索以进行修复。模板是否会引发错误?

我的观点

@method_decorator(user_access_to_log, name='dispatch')
class StatisticsView(LoginRequiredMixin,ListView, FormMixin):
    model = RequestRequest
    login_url = '/login/'
    template_name = 'statistics.html'
    form_class = DateMonthForm

    def get_context_data(self, **kwargs):
        context = super(StatisticsView, self).get_context_data(**kwargs)
        #logins = AuditEntry.objects.exclude(username='neuro')
        count = AuditEntry.objects.filter(action='user_logged_in').exclude(username='demo').exclude(username='neuro').values('username').annotate(total=Count('username')).order_by('total')

        #print(count)
        usernames = []
        counts = []
        for c in count:
            usernames.append(c['username'].encode('ascii','ignore'))
            counts.append(c['total'])
        print(usernames)
        requests = RequestRequest.objects.filter(referer__icontains='/shops/rest_new/',response=200,path='/rest/pharmakeia/').exclude(user=None).exclude(user__username='demo').exclude(user__username='neuro').values('user__username').annotate(total=Count('user__username')).order_by('total')
        print(requests)
        usernames_r = []
        counts_r = []
        for r in requests:
            usernames_r.append(r['user__username'].encode('ascii','ignore'))
            counts_r.append(r['total'])
        if self.request.POST:
            self.date_year = self.request.POST['date_year']
            self.date_month = self.request.POST['date_month']
        monthform = DateMonthForm(self.request.POST or None)
        context ['form'] = monthform
        context['counts_r'] = counts_r
        context['usernames_r'] = mark_safe(usernames_r)    
        context['counts'] = counts
        context['usernames'] = mark_safe(usernames)
        #context['logins'] = logins
        return context

widgets.py

from django.forms.widgets import TextInput, DateInput, DateTimeInput, TimeInput
import datetime
import re
from django.conf import settings
from django.forms.widgets import Widget, Select
from django.utils.dates import MONTHS
from django.utils.safestring import mark_safe

class MyEmailInput(TextInput):
    input_type = 'email'

class MyNumberInput(TextInput):
    input_type = 'number'

class MyTelephoneInput(TextInput):
    input_type = 'tel'

class MyDateInput(DateInput):
    input_type = 'date'
    format_key = 'DATE_INPUT_FORMATS'

class MyDateTimeInput(DateTimeInput):
    input_type = 'datetime'

class MyTimeInput(TimeInput):
    input_type = 'time'


RE_DATE = re.compile(r'(\d{4})-(\d\d?)-(\d\d?)$')

class MonthYearWidget(Widget):
    """
    A Widget that splits date input into two <select> boxes for month and year,
    with 'day' defaulting to the first of the month.

    Based on SelectDateWidget, in 

    django/trunk/django/forms/extras/widgets.py


    """
    none_value = (0, '---')
    month_field = '%s_month'
    year_field = '%s_year'

    def __init__(self, attrs=None, years=None, required=True):
        # years is an optional list/tuple of years to use in the "year" select box.
        self.attrs = attrs or {}
        self.required = required
        if years:
            self.years = years
        else:
            this_year = datetime.date.today().year
            self.years = range(this_year, this_year+3)

    def render(self, name, value, attrs=None):
        try:
            year_val, month_val = value.year, value.month
        except AttributeError:
            year_val = month_val = None
            if isinstance(value, basestring):
                match = RE_DATE.match(value)
                if match:
                    year_val, month_val, day_val = [int(v) for v in match.groups()]

        output = []

        if 'id' in self.attrs:
            id_ = self.attrs['id']
        else:
            id_ = 'id_%s' % name

        month_choices = MONTHS.items()
        #if not (self.required and value):
        #    month_choices.append(self.none_value)
        month_choices.sort()
        local_attrs = self.build_attrs(id=self.month_field % id_)
        s = Select(choices=month_choices)
        select_html = s.render(self.month_field % name, month_val, local_attrs)
        output.append(select_html)

        year_choices = [(i, i) for i in self.years]
        #if not (self.required and value):
        #    year_choices.insert(0, self.none_value)
        local_attrs['id'] = self.year_field % id_
        s = Select(choices=year_choices)
        select_html = s.render(self.year_field % name, year_val, local_attrs)
        output.append(select_html)

        return mark_safe(u'\n'.join(output))

    def id_for_label(self, id_):
        return '%s_month' % id_
    id_for_label = classmethod(id_for_label)

    def value_from_datadict(self, data, files, name):
        y = data.get(self.year_field % name)
        m = data.get(self.month_field % name)
        if y == m == "0":
            return None
        if y and m:
            return datetime.date(int(y), int(m), 1).strftime( settings.DATE_INPUT_FORMATS[0] )

我的回溯

Environment:


Request Method: GET
Request URL: .../logging/

Django Version: 1.11.16
Python Version: 2.7.12
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'intranet',
 'bootstrap3',
 'registration',
 'crispy_forms',
 'fm',
 'dal',
 'dal_select2',
 'rest_framework',
 'django_filters',
 'django_crontab']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Template error:
In template /var/www/vhosts/maps.karabinismedical.gr/geolocator/templates/base.html, error at line 0
   build_attrs() got an unexpected keyword argument 'id'   1 : {% load i18n %}
   2 : {% load static %}
   3 : {% load staticfiles %}
   4 : <!DOCTYPE html>
   5 : <html lang="en">
   6 :   <head>
   7 : 
   8 :     <meta charset="utf-8">
   9 :     <meta name="viewport" content="width=device-width, initial-scale=1.0">
   10 :      <style>


Traceback:

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

File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in _get_response
  217.                 response = self.process_exception_by_middleware(e, request)

File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in _get_response
  215.                 response = response.render()

File "/usr/local/lib/python2.7/dist-packages/django/template/response.py" in render
  107.             self.content = self.rendered_content

File "/usr/local/lib/python2.7/dist-packages/django/template/response.py" in rendered_content
  84.         content = template.render(context, self._request)

File "/usr/local/lib/python2.7/dist-packages/django/template/backends/django.py" in render
  66.             return self.template.render(context)

File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render
  207.                     return self._render(context)

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

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

File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py" in render
  177.             return compiled_parent._render(context)

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

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

File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

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

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

File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/usr/local/lib/python2.7/dist-packages/django/template/library.py" in render
  203.         output = self.func(*resolved_args, **resolved_kwargs)

File "/usr/local/lib/python2.7/dist-packages/bootstrap3/templatetags/bootstrap3.py" in bootstrap_form
  338.     return render_form(*args, **kwargs)

File "/usr/local/lib/python2.7/dist-packages/bootstrap3/forms.py" in render_form
  53.     return renderer_cls(form, **kwargs).render()

File "/usr/local/lib/python2.7/dist-packages/bootstrap3/renderers.py" in render
  87.         return mark_safe(self._render())

File "/usr/local/lib/python2.7/dist-packages/bootstrap3/renderers.py" in _render
  230.         return self.render_errors(self.error_types) + self.render_fields()

File "/usr/local/lib/python2.7/dist-packages/bootstrap3/renderers.py" in render_fields
  194.                 bound_css_class=self.bound_css_class,

File "/usr/local/lib/python2.7/dist-packages/bootstrap3/forms.py" in render_field
  69.     return renderer_cls(field, **kwargs).render()

File "/usr/local/lib/python2.7/dist-packages/bootstrap3/renderers.py" in render
  87.         return mark_safe(self._render())

File "/usr/local/lib/python2.7/dist-packages/bootstrap3/renderers.py" in _render
  551.         html = self.field.as_widget(attrs=self.widget.attrs)

File "/usr/local/lib/python2.7/dist-packages/django/forms/boundfield.py" in as_widget
  127.             **kwargs

File "/var/www/vhosts/maps.karabinismedical.gr/geolocator/intranet/widgets.py" in render
  77.         local_attrs = self.build_attrs(id=self.month_field % id_)

Exception Type: TypeError at /logging/
Exception Value: build_attrs() got an unexpected keyword argument 'id'

2 个答案:

答案 0 :(得分:1)

Django 1.11引入了template-based widget renderingbuild_attrs错误可能是由需要更新的表单窗口小部件引起的。

对于您而言,回溯向您显示错误发生在geolocator/intranet/widgets.py的第77行上的小部件中。

答案 1 :(得分:0)

最后我找到了答案。在我的小部件中,我必须更改代码,如下所示:

local_attrs=self.attrs
        local_attrs['id'] = self.year_field % id_
        s = Select(choices=month_choices)
        select_html = s.render(self.month_field % name, month_val, local_attrs)
        output.append(select_html)