'str' 对象没有属性 'get'
'str' object has no attribute 'get'
我试图通过重写 init 在模型中设置字段的选择
但我得到这个错误
'str' object has no attribute 'get'
forms.py
class carOwnerForm(forms.ModelForm):
first_name = forms.charfield()
last_name = forms.charfield()
def __init__(self, a,b,c):
super(carOwnerForm,self).__init(a,b,c)
self.fields['ownership_Type'].choices = [(a,'c'),(b,'b'),(c,'x')]
class Meta:
model = CarOwner
fields = ['ownership_type','CarModel']
查看
def CarOwnerSearch(request):
if request.user.is_authenticated():
form = carOwnerForm('B','None','C')
return render (request,'carmanager/CarOwnerSearch.html', {'form': form})
错误 html
Request Method: GET
Request URL: http://127.0.0.1:8000/parcelmanager/CrownLandsSearch/
Django Version: 1.8
Exception Type: AttributeError
Exception Value:
'list' object has no attribute 'get'
Exception Location: C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\forms\widgets.py in value_from_datadict, line 223
Traceback:
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\core\handlers\base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Sites\laisy\carmanager\views.py" in CrownLandsSearch
811. return render (request,'carmanager/CrownLandsSearch.html', {'form': form})
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\shortcuts.py" in render
67. template_name, context, request=request, using=using)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\loader.py" in render_to_string
99. return template.render(context, request)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\backends\django.py" in render
74. return self.template.render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in render
209. return self._render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in _render
201. return self.nodelist.render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in render
903. bit = self.render_node(node, context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\debug.py" in render_node
79. return node.render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\loader_tags.py" in render
135. return compiled_parent._render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in _render
201. return self.nodelist.render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in render
903. bit = self.render_node(node, context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\debug.py" in render_node
79. return node.render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\loader_tags.py" in render
65. result = block.nodelist.render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in render
903. bit = self.render_node(node, context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\debug.py" in render_node
79. return node.render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\debug.py" in render
89. output = self.filter_expression.resolve(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in resolve
647. obj = self.var.resolve(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in resolve
787. value = self._resolve_lookup(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in _resolve_lookup
847. current = current()
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\forms\forms.py" in as_p
302. errors_on_separate_row=True)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\forms\forms.py" in _html_output
203. top_errors = self.non_field_errors() # Errors that should be displayed above all fields.
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\forms\forms.py" in non_field_errors
310. return self.errors.get(NON_FIELD_ERRORS, self.error_class(error_class='nonfield'))
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\forms\forms.py" in errors
176. self.full_clean()
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\forms\forms.py" in full_clean
392. self._clean_fields()
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\forms\forms.py" in _clean_fields
401. value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\forms\widgets.py" in value_from_datadict
223. return data.get(name, None)
Exception Type: AttributeError at /parcelmanager/carOwnerSearch/
Exception Value: 'str' object has no attribute 'get'
这里确实有不少错误。
首先,模型形式需要一个特定的接口。他们接受 POST、任何初始数据和模型实例。但是你已经覆盖了它,所以他们只接受 a, b, c
,不管那是什么;你不仅破坏了 class 做它需要做的事情的能力,你还把这些参数传递给了 superclass 而它并不期望它们。
其次,你需要更加注意你的属性。表单没有 field
属性,它们有 fields
;选择字段没有 choice
属性,它有 choices
;对于 ID 和显示值,选择必须是可迭代对象的可迭代对象,而不是单个可迭代对象。
你会这样做来解决这个问题...
你的form.py
class CarOwnerForm(forms.ModelForm):
first_name = forms.charfield()
last_name = forms.charfield()
class Meta:
model = CarOwner
fields = ['ownership_type','CarModel']
def __init__(self, *args, **kwargs):
_choices_list = kwargs.pop('_choices', None)
super(CarOwnerForm, self).__init__(*args, **kwargs)
if _choices_list is not None:
# this only works if 'ownership_type' is a CharField... and it will be your error
self.fields['ownership_type'].choice = _choices_list # I don't remeber if the attribute is 'choice' or 'choices'
# if 'ownership_type' is a RelationField, you must set queryset and not a list of strings
在你的 views.py
...
def car_owner_search(request):
"""Doctype for view"""
if request.user.is_authenticated():
_CHOICE_LIST = ['B', 'None', 'C']
if request.method == 'POST':
form = CarOwnerForm(data=request.POST, _choices=_CHOICE_LIST)
if form.is_valid():
your_model = form.save(commit=False)
your_model.first_name = form.cleaned_data['first_name']
your_model.save()
else:
form = CarOwnerForm(_choices=_CHOICE_LIST)
return render (request,'carmanager/CarOwnerSearch.html', {'form': form})
return HttpRedirect('/login/') # or other HttpResponse
我试图通过重写 init 在模型中设置字段的选择 但我得到这个错误
'str' object has no attribute 'get'
forms.py
class carOwnerForm(forms.ModelForm):
first_name = forms.charfield()
last_name = forms.charfield()
def __init__(self, a,b,c):
super(carOwnerForm,self).__init(a,b,c)
self.fields['ownership_Type'].choices = [(a,'c'),(b,'b'),(c,'x')]
class Meta:
model = CarOwner
fields = ['ownership_type','CarModel']
查看
def CarOwnerSearch(request):
if request.user.is_authenticated():
form = carOwnerForm('B','None','C')
return render (request,'carmanager/CarOwnerSearch.html', {'form': form})
错误 html
Request Method: GET
Request URL: http://127.0.0.1:8000/parcelmanager/CrownLandsSearch/
Django Version: 1.8
Exception Type: AttributeError
Exception Value:
'list' object has no attribute 'get'
Exception Location: C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\forms\widgets.py in value_from_datadict, line 223
Traceback:
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\core\handlers\base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Sites\laisy\carmanager\views.py" in CrownLandsSearch
811. return render (request,'carmanager/CrownLandsSearch.html', {'form': form})
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\shortcuts.py" in render
67. template_name, context, request=request, using=using)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\loader.py" in render_to_string
99. return template.render(context, request)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\backends\django.py" in render
74. return self.template.render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in render
209. return self._render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in _render
201. return self.nodelist.render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in render
903. bit = self.render_node(node, context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\debug.py" in render_node
79. return node.render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\loader_tags.py" in render
135. return compiled_parent._render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in _render
201. return self.nodelist.render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in render
903. bit = self.render_node(node, context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\debug.py" in render_node
79. return node.render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\loader_tags.py" in render
65. result = block.nodelist.render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in render
903. bit = self.render_node(node, context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\debug.py" in render_node
79. return node.render(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\debug.py" in render
89. output = self.filter_expression.resolve(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in resolve
647. obj = self.var.resolve(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in resolve
787. value = self._resolve_lookup(context)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\template\base.py" in _resolve_lookup
847. current = current()
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\forms\forms.py" in as_p
302. errors_on_separate_row=True)
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\forms\forms.py" in _html_output
203. top_errors = self.non_field_errors() # Errors that should be displayed above all fields.
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\forms\forms.py" in non_field_errors
310. return self.errors.get(NON_FIELD_ERRORS, self.error_class(error_class='nonfield'))
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\forms\forms.py" in errors
176. self.full_clean()
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\forms\forms.py" in full_clean
392. self._clean_fields()
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\forms\forms.py" in _clean_fields
401. value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
File "C:\Users\yfevrier\Envs\landregtry1\lib\site-packages\django\forms\widgets.py" in value_from_datadict
223. return data.get(name, None)
Exception Type: AttributeError at /parcelmanager/carOwnerSearch/
Exception Value: 'str' object has no attribute 'get'
这里确实有不少错误。
首先,模型形式需要一个特定的接口。他们接受 POST、任何初始数据和模型实例。但是你已经覆盖了它,所以他们只接受 a, b, c
,不管那是什么;你不仅破坏了 class 做它需要做的事情的能力,你还把这些参数传递给了 superclass 而它并不期望它们。
其次,你需要更加注意你的属性。表单没有 field
属性,它们有 fields
;选择字段没有 choice
属性,它有 choices
;对于 ID 和显示值,选择必须是可迭代对象的可迭代对象,而不是单个可迭代对象。
你会这样做来解决这个问题...
你的form.py
class CarOwnerForm(forms.ModelForm):
first_name = forms.charfield()
last_name = forms.charfield()
class Meta:
model = CarOwner
fields = ['ownership_type','CarModel']
def __init__(self, *args, **kwargs):
_choices_list = kwargs.pop('_choices', None)
super(CarOwnerForm, self).__init__(*args, **kwargs)
if _choices_list is not None:
# this only works if 'ownership_type' is a CharField... and it will be your error
self.fields['ownership_type'].choice = _choices_list # I don't remeber if the attribute is 'choice' or 'choices'
# if 'ownership_type' is a RelationField, you must set queryset and not a list of strings
在你的 views.py
...
def car_owner_search(request):
"""Doctype for view"""
if request.user.is_authenticated():
_CHOICE_LIST = ['B', 'None', 'C']
if request.method == 'POST':
form = CarOwnerForm(data=request.POST, _choices=_CHOICE_LIST)
if form.is_valid():
your_model = form.save(commit=False)
your_model.first_name = form.cleaned_data['first_name']
your_model.save()
else:
form = CarOwnerForm(_choices=_CHOICE_LIST)
return render (request,'carmanager/CarOwnerSearch.html', {'form': form})
return HttpRedirect('/login/') # or other HttpResponse