【问题标题】:Django forms not accepting custom dict based label --- AttributeError unicode object has no attribute getDjango 表单不接受基于 dict 的自定义标签 --- AttributeError unicode 对象没有属性获取
【发布时间】:2011-05-22 23:20:45
【问题描述】:

我正在尝试使用如下所示的类在 Django 中编辑表单标签:

from django import forms
class Form(forms.Form):
    e = {}
    gender = forms.ChoiceField(choices = ())
    #_remaining variables_
    def __init__(self, lang):
         t = Translation.objects.get(template_file = 'VirasatForm')
         startcount = t.id +1
         endcount = t.page_entries.count() + t.id + 1
         for i in range(startcount, endcount):
            w = t.page_entries.get(id = i).template_file
            if lang == 'en':
                r = t.page_entries.get(id = i).enTranslate
            elif lang == 'lsd':
                r = t.page_entries.get(id = i).lsdTranslate
            elif lang == 'ar':
                r = t.page_entries.get(id = i).arTranslate
            self.e[w] = r

       super(Form,self).__init__(self, lang)
       self.fields['gender'].choices = (('m',self.e['Male']),('f',self.e['Female']))
       self.fields['gender'].label = self.e['gender'])

这里的问题是我得到的只是 AttributeError: 'unicode' object has no attribute 'get'

提前致谢

【问题讨论】:

  • 你能告诉我们错误发生在哪一行吗?
  • 它出现在 self.fields['gender'].choices...

标签: python django


【解决方案1】:

您可以像这样动态创建表单:

class Form(forms.Form):
    def __init__(self, gender_choices, *args, **kwargs):
        super(Form, self).__init__(*args, **kwargs)
        self.fields['gender'] = forms.ChoiceField(choices=gender_choices)

示例用法:

>>> choices = (('m', 'Male'), ('f', 'Female'))

>>> f = Form(choices)

>>> print f
<tr><th><label for="id_gender">Gender:</label></th><td><select name="gender" id="id_gender">
<option value="m">Male</option>
<option value="f">Female</option>
</select></td></tr>

【讨论】:

  • 但是,问题在于,由于有很多字段,并且每个字段都有不同的标签(我也将它用于标签),这将涉及很多额外的输入。
  • 请考虑可维护性和可读性!任何必须接触您的代码的人都会感谢您。一年后,如果你需要再看一遍,你会感谢自己的!
  • 感谢您的提示。我一定会记住的。我设法找出如何使用代码执行您所说的操作。
  • @ajamali 当然,您可以创建动态表单。我相应地更新了我的答案(我的反应是一个下意识的反应,对所有那些乱七八糟的东西)。我认为您错误地调用了super,这可能导致了您的问题。
猜你喜欢
  • 2017-06-04
  • 2019-06-03
  • 2015-03-24
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 2018-09-02
  • 2021-01-30
  • 2020-09-11
相关资源
最近更新 更多