Django表单对象没有'get'属性。

5

你好,我在尝试将一个表单模板加载到HTML中时遇到了错误。当它加载时,我收到的错误消息是:

'CleanUpSelectForm' object has no attribute 'get'

无法正常工作的HTML代码段如下:

        <form id="feedback_select" class='hidden' action="{% url 'clean_feedback' %}" method="post" autocomplete="off">
        {% csrf_token %}
        {% for field in forms %}
            {% include "snippets/simple_form_row.html" with label=field.label_tag val=field|addcss:'profile_field' %}
        {% endfor %}
        <div style="text-align:right" class="top-padding">
            <button class="mainButton get_feedback">show feedback</button>
        </div>
        <hr class="fade-in-out-right">
    </form>
类如下:
class CleanUpSelectForm(forms.Form):

def __init__(self, company=None):
    super(CleanUpSelectForm,self).__init__(self)

    self.FILTER_TRANSLATIONS = dict(
        test_cycle='test_cycle_id',
        app_version='question__group__app_id',
        app_reference='question__group__app__app_reference_id',
    )

    self.NULL_CHOICE = [('', 'Please Select')]
    self.TC_CHOICES = models.TestCycle.objects.filter(
        id__in=models.Feedback.objects.filter(done=False).values_list('test_cycle_id',flat=True)
    )

    self.RELATED_QUESTIONS = models.Question.objects.filter(
        id__in=models.Feedback.objects.filter(done=False).values_list('question_id',flat=True))

    self.RELATED_QUESTION_GROUPS = models.QuestionGroup.objects.filter(
        id__in=self.RELATED_QUESTIONS.values_list('group_id', flat=True))

    self.RELATED_APPS = models.App.objects.filter(
        id__in=self.RELATED_QUESTION_GROUPS.values_list('app_id', flat=True))

    self.APP_CHOICES = models.AppReference.objects.filter(
        id__in=self.RELATED_APPS.values_list('app_reference_id', flat=True)
    ).values_list('id','name')

    if company:
        self.TC_CHOICES = self.TC_CHOICES.filter(company=company).values_list('id','name')
    else:
        self.TC_CHOICES = self.TC_CHOICES.values_list('id','name')

    self.test_cycle = forms.ChoiceField(choices=self.NULL_CHOICE+list(self.TC_CHOICES), required=False)
    self.app_reference = forms.ChoiceField(choices=self.NULL_CHOICE+list(self.APP_CHOICES), required=False,
                                      widget=forms.Select(attrs={'appref':
                                                                     'true'})
                                      )
    self.app_version = forms.ChoiceField(choices=self.RELATED_APPS.values_list('id',
                                                                     'version'), required=False,
                                      widget=forms.Select(attrs={
                                          'form_display': 'none'})
                                      )
    self.fields['test_cycle'] = self.test_cycle

并且它是从 .py 文件内的这里调用的

    context.update({'forms': CleanUpSelectForm()})

如果我删除self.fields['test_cycle'] = self.test_cycle这一行,并替换为self.fields = [],则不会出现错误,但显然模板为空。因此,我正在寻找正确的方法来无误地填充表单字段。再次感谢帮助,因为我陷入了困境!
编辑 - 堆栈跟踪:
    Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/clean_feedback/

Django Version: 1.7.4
Python Version: 2.7.6
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.humanize',
 'nested_inline',
 'django.contrib.admin',
 'tccore')
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',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware')


Template error:
In template /Users/stephenharrison/Documents/Repo/TestRocket/tccore/templates/tccore/clean_up.html, error at line 18
   'CleanUpSelectForm' object has no attribute 'get'
   8 : {% endblock js %}


   9 : {% block navs %}


   10 : <div class="see_layout top_right_menu linked " data-href="{% url 'groundcontrol' %}">Ground control</div>


   11 : {% endblock %}


   12 : 


   13 : {% block content %}


   14 :     {%  if forms %}


   15 :         <form id="feedback_select" class='hidden' action="{% url 'clean_feedback' %}" method="post" autocomplete="off">


   16 :             {% csrf_token %}


   17 :             {% for field in forms %}


   18 :                  {% include "snippets/simple_form_row.html" with label=field.label_tag val=field|addcss:'profile_field' %} 


   19 :             {% endfor %}


   20 :             <div style="text-align:right" class="top-padding">


   21 :                 <button class="mainButton get_feedback">show feedback</button>


   22 :             </div>


   23 :             <hr class="fade-in-out-right">


   24 :         </form>


   25 :     {% endif %}


   26 :     <div id="counter"></div>


   27 :     <div id="cleaner" class="hidden">


   28 :         <div id="cleaner_headers">


Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Library/Python/2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
  21.                 return view_func(request, *args, **kwargs)
File "/Users/stephenharrison/Documents/Repo/TestRocket/tccore/views/clean_up.py" in clean_feedback
  167.     return render(request, template, context)
File "/Library/Python/2.7/site-packages/django/shortcuts.py" in render
  50.     return HttpResponse(loader.render_to_string(*args, **kwargs),
File "/Library/Python/2.7/site-packages/django/template/loader.py" in render_to_string
  178.         return t.render(context_instance)
File "/Library/Python/2.7/site-packages/django/template/base.py" in render
  148.             return self._render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in _render
  142.         return self.nodelist.render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in render
  844.                 bit = self.render_node(node, context)
File "/Library/Python/2.7/site-packages/django/template/debug.py" in render_node
  80.             return node.render(context)
File "/Library/Python/2.7/site-packages/django/template/loader_tags.py" in render
  126.         return compiled_parent._render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in _render
  142.         return self.nodelist.render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in render
  844.                 bit = self.render_node(node, context)
File "/Library/Python/2.7/site-packages/django/template/debug.py" in render_node
  80.             return node.render(context)
File "/Library/Python/2.7/site-packages/django/template/defaulttags.py" in render
  38.         output = self.nodelist.render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in render
  844.                 bit = self.render_node(node, context)
File "/Library/Python/2.7/site-packages/django/template/debug.py" in render_node
  80.             return node.render(context)
File "/Library/Python/2.7/site-packages/django/template/loader_tags.py" in render
  65.                 result = block.nodelist.render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in render
  844.                 bit = self.render_node(node, context)
File "/Library/Python/2.7/site-packages/django/template/debug.py" in render_node
  80.             return node.render(context)
File "/Library/Python/2.7/site-packages/django/template/defaulttags.py" in render
  312.                 return nodelist.render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in render
  844.                 bit = self.render_node(node, context)
File "/Library/Python/2.7/site-packages/django/template/debug.py" in render_node
  80.             return node.render(context)
File "/Library/Python/2.7/site-packages/django/template/defaulttags.py" in render
  201.                             nodelist.append(node.render(context))
File "/Library/Python/2.7/site-packages/django/template/loader_tags.py" in render
  145.                 for name, var in six.iteritems(self.extra_context)
File "/Library/Python/2.7/site-packages/django/template/loader_tags.py" in <dictcomp>
  145.                 for name, var in six.iteritems(self.extra_context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in resolve
  624.                 new_obj = func(obj, *arg_vals)
File "/Users/stephenharrison/Documents/Repo/TestRocket/tccore/templatetags/tccore_extras.py" in addcss
  74.     return field.as_widget(attrs={"class": ' '.join([field.field.widget.attrs.get('class',''), css])})
File "/Library/Python/2.7/site-packages/django/forms/forms.py" in as_widget
  560.         return force_text(widget.render(name, self.value(), attrs=attrs))
File "/Library/Python/2.7/site-packages/django/forms/forms.py" in value
  601.                 self.data, self.form.initial.get(self.name, self.field.initial)
File "/Library/Python/2.7/site-packages/django/forms/forms.py" in data
  583.         return self.field.widget.value_from_datadict(self.form.data, self.form.files, self.html_name)
File "/Library/Python/2.7/site-packages/django/forms/widgets.py" in value_from_datadict
  228.         return data.get(name, None)

Exception Type: AttributeError at /clean_feedback/
Exception Value: 'CleanUpSelectForm' object has no attribute 'get'
    enter code here

1
你能添加错误信息的完整堆栈跟踪吗? - dhke
不要试图在__init__方法中添加表单字段...将您想要的字段放在类体中,然后仅在init方法中自定义字段选择和其他需要更改的字段属性。 - Anentropic
你为什么要在第一次定义self.test_cycle?这似乎只应该是一个本地变量,然后将其添加到self.fields中。(对于其他变量,如TC_CHOICES,也是如此。) - Daniel Roseman
最初,这个表单只是一个没有__init__的类(不幸的是我的同事创建了它,所以我对这段代码很新),然而现在我们需要使用__init__来创建这个表单,以便根据“request.user”变量动态填充表单。 我同意这些变量不需要被设置,它们只是之前代码的残留物,我还没有整理好。谢谢大家最初的反馈。 - Steve H
2个回答

21

这里问题的原因是:

super(CleanUpSelectForm,self).__init__(self)

当使用 super(..) 时,您不需要传递 self。因此应该这样写:

super(CleanUpSelectForm,self).__init__()

0

在表单的__init__()中直接添加Django表单字段不受支持。

表单字段应该声明为类属性。Django(实际上是django.forms.forms.DeclarativeFieldsMetaclass)从__new__()中的类属性中提取表单字段。表单字段在对象创建之前进行转换,因此如果绕过该机制,则行为本质上是未定义的。

如果需要动态选择,请使用callable作为choices参数:

NULL_CHOICE = [...]

def get_tc_choices():
    return NULL_CHOICE + list(models.TestCycle.objects.filter(
        id__in=models.Feedback.objects.filter(done=False).values_list('test_cycle_id',flat=True)
    ))

[...]
class CleanUpSelectForm(forms.Form):
    test_cycle = forms.ChoiceField(choices=get_tc_choices, required=False)

当选择列表是上下文敏感的(即您需要根据控制器中发生的某些事情进行过滤),这不是一个解决方案。 - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接