简体   繁体   中英

'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

 '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

    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

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

...
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. But you've overridden that so that they only accept a, b, c , whatever that is; 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 ; a choicefield doesn't have a choice attribute, it has choices ; and choices needs to be a iterable of iterables, for IDs and display values, not a single iterable.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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