【问题标题】:Why the contents of the form changes?为什么表格的内容会发生变化?
【发布时间】: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


【解决方案1】:

我终于发现我的错误了!就在这一行:

RequirementForm(data=request.POST, final_list=final_list) 

【讨论】:

    猜你喜欢
    • 2017-08-22
    • 2010-11-20
    • 2020-01-18
    • 2010-11-09
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多