【发布时间】:2017-09-28 05:53:58
【问题描述】:
我正在尝试为choicesof symbol 字段创建动态列表。我在视图中创建该列表,然后将其放入表单构造函数中。
我想从Dictionary modal 中获取所有数据并将其放入choices 并以我的形式显示,但同时我不需要显示Requirement modal 中已经存在的数据。
然后,当我尝试单击提交按钮时,表单更改为:(发生了什么错误?)
models.py:
class Dictionary(models.Model):
symbol = models.CharField(_('Symbol'), max_length=250)
name = models.CharField(_('Name'), max_length=250)
class Requirement(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE)
symbol = models.CharField(_('Symbol'), max_length=250)
name = models.CharField(_('Name'), max_length=250)
forms.py:
class RequirementForm(forms.ModelForm):
symbol = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple)
class Meta:
model = Requirement
fields = ('symbol',)
def __init__(self, final_list, *args, **kwargs):
super(RequirementForm, self).__init__(*args, **kwargs)
self.fields['symbol'].choices = [(x[0], x[1]) for x in final_list)]
views.py:
def requirement_add(request, project_code):
data = dict()
project = get_object_or_404(Project, pk=project_code)
requirements = Requirement.objects.filter(project=project_code)
result = []
for x in requirements:
v = (x.symbol, x.name)
result.append(v)
full_result = [(x.symbol, x.name) for x in Dictionary.objects.all()]
final_list= list(set(full_result) ^ set(result))
if request.method == 'POST':
form = RequirementForm(request.POST, final_list)
if form.is_valid():
requirement_dict = dict(((x.symbol, x.name) for x in Dictionary.objects.all()))
symbols = form.cleaned_data.get('symbol')
requirement = form.save(commit=False)
for symbol in symbols:
requirement.project = project
requirement.symbol = symbol
requirement.name = requirement_dict [symbol]
requirement.pk = None
requirement.save()
data['form_is_valid'] = True
requirements = Requirement.objects.filter(project=project_code)
context = {'project': project, 'requirement': requirement, 'requirements': requirements}
data['html_requirement'] = render_to_string('project/requirement_list.html', context)
else:
data['form_is_valid'] = False
else:
form = RequirementForm(final_list)
context = {'project': project, 'form': form}
data['html_requirement_form'] = render_to_string('project/requirement_add.html', context, request=request)
return JsonResponse(data)
错误:
Traceback (most recent call last):
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\exception.py", line 39, in inner
response = get_response(request)
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\reversion\revisions.py", line 296, in do_revision_context
return func(*args, **kwargs)
File "C:\Users\Nurzhan\PycharmProjects\RMS\project\views.py", line 616, in requirement_add
if form.is_valid():
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\forms\forms.py", line 169, in is_valid
return self.is_bound and not self.errors
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\forms\forms.py", line 161, in errors
self.full_clean()
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\forms\forms.py", line 370, in full_clean
self._clean_fields()
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\forms\forms.py", line 382, in _clean_fields
value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\forms\widgets.py", line 626, in value_from_datadict
return data.get(name)
AttributeError: 'list' object has no attribute 'get'
【问题讨论】:
-
该视图的其余部分在哪里?内容究竟什么时候改变?
-
@DanielRoseman 你好!我添加了我的观点的完整代码。请检查一下。正如我在帖子中所说,我有表单,用户可以在其中选择复选框,然后将数据添加到数据库。在视图中,我为
choises创建了动态列表,但是在单击表单中的提交按钮时出现问题。表单不向数据库添加数据。它只是改变表单内容。我不明白我在哪里做错了?你有什么想法吗?! -
正如我在帖子中所说,我想从 Dictionary modal 中获取所有数据,将其放入选项中并以我的形式显示,但同时我不需要显示 Requirement 中已经存在的数据模态的。我的动态列表有效。但形式工作错误。在帖子中,您可以看到当我单击提交按钮时表单内容如何变化的图片。
-
@DanielRoseman 我将此
print([(x[0], x[1]) for x in final_list])添加到我的表单中只是为了知道choises的列表类型。当我打开表单时,它会在控制台中显示:[('A', 'Requirement A'), ('B', 'Requirement B')],这是正确的。然后,当我在复选框中选择值并单击控制台中的提交按钮时,它会显示:[('c', 's'), ('s', 'y')]并引发错误。你能再看看我的帖子吗?您有什么想法吗?
标签: python django python-3.x django-forms django-1.10