简体   繁体   English

'str'对象没有属性'get'

[英]'str' object has no attribute 'get'

I am trying to set a field's choices in a modelform by overiding the init but i get this error 我试图通过覆盖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']

view 视图

def CarOwnerSearch(request):
if request.user.is_authenticated():
    form = carOwnerForm('B','None','C')
    return render (request,'carmanager/CarOwnerSearch.html', {'form': form})

error in the html 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'

You would do it to solve this problem... 您可以解决此问题...

your form.py 您的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

and in your views.py 并在您的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

There are really quite a few errors here. 这里确实有很多错误。

Firstly, modelforms expect a certain interface. 首先,模型形式需要特定的接口。 They accept the POST, any initial data, and a model instance. 他们接受POST,任何初始数据和模型实例。 But you've overridden that so that they only accept a, b, c , whatever that is; 但是您已经覆盖了它,以便它们仅接受a, b, c ,无论是什么。 not only have you destroyed the ability of the class to do the things it needs to do, you also pass those arguments on to the superclass which isn't expecting them. 您不仅破坏了该类执行其所需要做的事情的能力,而且还将这些参数传递给了不期望它们的超类。

Secondly, you need to take more care with your attributes. 其次,您需要更加注意自己的属性。 Forms don't have a field attribute, they have fields ; 表单没有field属性,它们具有fields a choicefield doesn't have a choice attribute, it has choices ; choice字段没有choice属性,它具有choices and choices needs to be a iterable of iterables, for IDs and display values, not a single iterable. 对于ID和显示值,选择必须是可迭代的迭代,而不是单个可迭代。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM