![](/img/trans.png)
[英]Django AttributeError: 'tuple' object has no attribute 'get'
[英]AttributeError: 'tuple' object has no attribute 'get' in Django
我想將多選字段添加到我的項目應用程序中。 此字段應允許用戶選擇多個選項。 但是我得到一個錯誤。 在添加多選字段之前,這部分沒有給出任何錯誤。 我的錯誤在哪里?
我的views.py
def project_new(request):
if request.method == 'POST':
form = ProjectForm(request.POST)
if form.is_valid():
project = Project()
...
project.lang_choices = form.cleaned_data['select_lang']
project.save()
return redirect('projects')
else:
form = ProjectForm()
return render(request, 'blog/project_new.html', {'form': form})
@login_required(login_url='/login/')
def project_details(request, pk):
project = get_object_or_404(Project, pk=pk)
return render(request, 'blog/project_detail.html', {'project': project})
我的models.py
class ProgrammingLanguage(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Project(models.Model):
...
select_langs = models.ManyToManyField(ProgrammingLanguage)
...
slug = models.UUIDField(default=uuid.uuid4)
...
表格
class ProjectForm(forms.Form):
...
select_lang = forms.ChoiceField(
label='diller: ',
widget=forms.CheckboxSelectMultiple()
)
def __init__(self, *args, **kwargs):
super(ProjectForm, self).__init__(args, kwargs)
self.fields['select_lang'].choices = [(l.id, l.name) for l in ProgrammingLanguage.objects.all()]
class Meta:
model = Project
fields = (
'first_name', 'last_name', 'email', 'project_name', 'project_description', 'project_notes', 'select_langs')
這是我的回溯
Internal Server Error: /project/new/
Traceback (most recent call last):
File "/home/eda/.local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/home/eda/.local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/eda/.local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/eda/.local/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/home/eda/staj_defteri/project/views.py", line 16, in project_new
if form.is_valid():
File "/home/eda/.local/lib/python2.7/site-packages/django/forms/forms.py", line 183, in is_valid
return self.is_bound and not self.errors
File "/home/eda/.local/lib/python2.7/site-packages/django/forms/forms.py", line 175, in errors
self.full_clean()
File "/home/eda/.local/lib/python2.7/site-packages/django/forms/forms.py", line 384, in full_clean
self._clean_fields()
File "/home/eda/.local/lib/python2.7/site-packages/django/forms/forms.py", line 396, in _clean_fields
value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
File "/home/eda/.local/lib/python2.7/site-packages/django/forms/widgets.py", line 240, in value_from_datadict
return data.get(name)
AttributeError: 'tuple' object has no attribute 'get'
[17/Sep/2018 08:19:35] "POST /project/new/ HTTP/1.1" 500 98194
錯誤可能是因為您使用args
和kwargs
作為兩個參數而不是序列解super(ProjectForm, self).__init__
和字典解super(ProjectForm, self).__init__
調用super(ProjectForm, self).__init__
的事實,例如:
def __init__(self, *args, **kwargs):
super(ProjectForm, self).__init__(*args, **kwargs)
self.fields['select_lang'].choices = [
(l.id, l.name) for l in ProgrammingLanguage.objects.all()
]
如果使用args
等調用它,則第一個參數將包含一個(可能為空)元組作為data
參數。 如果隨后您打算處理data
,它將無法進行處理。
話雖這么說,我不明白您為什么在這里將其forms.ChoiceField
一個forms.ChoiceField
。 默認情況下,Django將選擇一個ModelMultipleChoiceField
[Django-doc]字段,並且默認情況下還將接收全部ProgrammingLanguage
onbjects集合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.