2016-10-28 64 views
-1

我試圖通過overiding的初始化 中的ModelForm設置字段的選擇,但我得到這個錯誤「海峽」對象有沒有屬性「得到」

'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' 
+0

請檢查凹痕。至少它在你的例子中被破壞了 – frlan

+0

'data'變量的類型是'str',因此是錯誤的。你可以使用'如果名稱在數據'來檢查'數據'中是否存在'名稱' –

回答

2

你會做它來解決這個問題...

您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 
+0

謝謝,你的幫助我能解決它!!!!! 我不完全理解初始化方法和*參數,* kwards 這應該是agruements和dictionarys,但是謝謝 謝謝! – user1778743

1

這裏確實有不少錯誤。

首先,模型預期某個接口。他們接受POST,任何初始數據和模型實例。但是你忽略了這一點,所以他們只接受a, b, c,不管那是什麼;你不僅摧毀了課堂做它需要做的事情的能力,你還將這些論據傳遞給不期望它們的超類。

其次,你需要更加關心你的屬性。表單沒有field屬性,它們有fields;選擇字段不具有choice屬性,它具有choices;並且選擇需要是可迭代的迭代器,用於ID和顯示值,而不是單個迭代器。

+0

即時通訊我犯了很多錯誤我的實際代碼有字段和選擇我不知道爲什麼它丟棄了's' 我要找的是該模型有一組選擇,但在一個視圖中,我只想要三個中的兩個,並且認爲我必須重寫init以使其顯示不同的chocies。 我還希望當我不提供agruements加載模型形式的所有內容 – user1778743

相關問題