将参数传递给 django 表单

Posted

技术标签:

【中文标题】将参数传递给 django 表单【英文标题】:Pass parameter to django form 【发布时间】:2020-04-13 00:33:07 【问题描述】:

我需要使用登录的用户作为参数在 Django Form(不是 ModelForm)中动态创建一个选择字段。

观点:

def cadastro(request):
    medico = request.user.medico
    usuario=request.user
    clinicas = medicos.clinicas.all()
    escolhas = tuple([(c.id, c.nome.clinica) for c in clinicas])
    
    if request.method == 'POST':
           formulario = NovoProcesso(escolhas, request.POST)

        if formulario.is_valid(): 
        formulario.save(usuario)
        
else:
    formulario = NovoProcesso(escolhas)

contexto = 'formulario': formulario, 'clinicas': clinicas  

return render(request, 'processos/cadastro.html', contexto)

表单类:

class NovoProcesso(forms.Form):
 def __init__(self, escolhas, *args, **kwargs):
     super(NovoProcesso, self).__init__(escolhas, *args, **kwargs) -------> the source of the problem is here.

     self.fields['clinicas'].choices = escolhas


 clinicas = forms.ChoiceField(widget=forms.Select, choices=[])
 # there are other fields here, but I ommited for the sake of clarity

  def(save):
  #custom save method....

我错误地将参数传递给 init 方法,如下所述: object has no attribute 'get'

我无法理解这行: self.fields['clinicas'].choices = escolhas

不确定我应该写 self.fields['clinicas].choices 还是 .小部件....不确定如何在类中编写格式字段。尝试了几种变体。

我收到以下错误:

内部服务器错误:/processos/cadastro/ Traceback(最近 最后调用):文件 “/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py”, 第 158 行,在 getitem 中 field = self.fields[name] KeyError: 'errors'

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件 “/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 828 行,在 _resolve_lookup 中 当前=当前[位]文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py”, 第 160 行,在 getitem 中 raise KeyError(KeyError: "在 'NovoProcesso' 中找不到关键的'错误'。选择有:altura、anamnese、cid、clinicas、 cpf_paciente,data_1,诊断,incapaz,med1,med1_posologia_mes1, nome_mae,nome_paciente,nome_responsavel,比索,qtd_med1_mes1, qtd_med1_mes2, qtd_med1_mes3, tratamentos_previos, tratou。”

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件 “/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/exception.py”, 第 34 行,在内部 response = get_response(请求)文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/base.py”, 第 115 行,在 _get_response 中 response = self.process_exception_by_middleware(e,request)文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/base.py”, 第 113 行,在 _get_response 中 response = Wrapped_callback(request, *callback_args, **callback_kwargs) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/contrib/auth/decorators.py", 第 21 行,在 _wrapped_view return view_func(request, *args, **kwargs) File "/home/lucas/dev/autocusto/processos/views.py", line 101, in cadastro 返回渲染(请求,'processos/cadastro.html',contexto)文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/shortcuts.py”, 第 19 行,在渲染中 content = loader.render_to_string(template_name, context, request, using=using) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader.py", 第 62 行,在 render_to_string 中 返回 template.render(context, request) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/backends/django.py", 第 61 行,在渲染中 返回 self.template.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 171 行,在渲染中 返回 self._render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 163 行,在 _render 中 返回 self.nodelist.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 936 行,在渲染中 bit = node.render_annotated(context) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", 第 903 行,在 render_annotated 中 返回 self.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader_tags.py”, 第 150 行,在渲染中 返回已编译的_parent._render(上下文)文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 163 行,在 _render 中 返回 self.nodelist.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 936 行,在渲染中 bit = node.render_annotated(context) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", 第 903 行,在 render_annotated 中 返回 self.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader_tags.py”, 第 62 行,在渲染中 结果 = block.nodelist.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 936 行,在渲染中 bit = node.render_annotated(context) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", 第 903 行,在 render_annotated 中 返回 self.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 986 行,在渲染中 输出 = self.filter_expression.resolve(context) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", 第 670 行,解决中 obj = self.var.resolve(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 795 行,解决中 值 = self._resolve_lookup(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 836 行,在 _resolve_lookup 中 current = getattr(current, bit) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", 第 175 行,错误 self.full_clean() 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py”, 第 376 行,在 full_clean 中 self._clean_fields() 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py”, 第 388 行,在 _clean_fields value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) 文件 “/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/widgets.py”, 第 258 行,在 value_from_datadict 中 return data.get(name) AttributeError: 'tuple' 对象没有属性 'get' [20/Dec/2019 13:09:03] "GET /processos/cadastro/ HTTP/1.1" 500 215106 /home/lucas/dev/autocusto/processos/views.py 改变,重新加载。使用 StatReloader 监视文件更改 正在执行系统检查...

系统检查未发现任何问题(0 静音)。 2019 年 12 月 20 日 - 13:11:10 Django 3.0 版,使用设置'autocusto.settings' 在http://127.0.0.1:8000/启动开发服务器退出服务器 使用 CONTROL-C。 /home/lucas/dev/autocusto/processos/forms.py 改变了, 重新加载。使用 StatReloader Performing 监视文件更改 系统检查...

系统检查未发现任何问题(0 静音)。 2019 年 12 月 20 日 - 13:11:24 Django 3.0 版,使用设置'autocusto.settings' 在http://127.0.0.1:8000/ 启动开发服务器 退出服务器 使用 CONTROL-C。 [(1, 'SHAM'), (2, '65'), (3, '65asdfasdf'), (4, 'Clínica 1'), (5, 'Clínica 2'), (6, 'Clínica 3')] 内部服务器 错误:/processos/cadastro/ Traceback(最近一次调用最后一次):文件 “/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py”, 第 158 行,在 getitem 中 field = self.fields[name] KeyError: 'errors'

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件 “/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 828 行,在 _resolve_lookup 中 当前=当前[位]文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py”, 第 160 行,在 getitem 中 raise KeyError(KeyError: "在 'NovoProcesso' 中找不到关键的'错误'。选择有:altura、anamnese、cid、clinicas、 cpf_paciente,data_1,诊断,incapaz,med1,med1_posologia_mes1, nome_mae,nome_paciente,nome_responsavel,比索,qtd_med1_mes1, qtd_med1_mes2, qtd_med1_mes3, tratamentos_previos, tratou。”

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件 “/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/exception.py”, 第 34 行,在内部 response = get_response(请求)文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/base.py”, 第 115 行,在 _get_response 中 response = self.process_exception_by_middleware(e,request)文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/base.py”, 第 113 行,在 _get_response 中 response = Wrapped_callback(request, *callback_args, **callback_kwargs) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/contrib/auth/decorators.py", 第 21 行,在 _wrapped_view return view_func(request, *args, **kwargs) File "/home/lucas/dev/autocusto/processos/views.py", line 101, in cadastro 返回渲染(请求,'processos/cadastro.html',contexto)文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/shortcuts.py”, 第 19 行,在渲染中 content = loader.render_to_string(template_name, context, request, using=using) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader.py", 第 62 行,在 render_to_string 中 返回 template.render(context, request) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/backends/django.py", 第 61 行,在渲染中 返回 self.template.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 171 行,在渲染中 返回 self._render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 163 行,在 _render 中 返回 self.nodelist.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 936 行,在渲染中 bit = node.render_annotated(context) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", 第 903 行,在 render_annotated 中 返回 self.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader_tags.py”, 第 150 行,在渲染中 返回已编译的_parent._render(上下文)文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 163 行,在 _render 中 返回 self.nodelist.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 936 行,在渲染中 bit = node.render_annotated(context) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", 第 903 行,在 render_annotated 中 返回 self.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader_tags.py”, 第 62 行,在渲染中 结果 = block.nodelist.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 936 行,在渲染中 bit = node.render_annotated(context) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", 第 903 行,在 render_annotated 中 返回 self.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 986 行,在渲染中 输出 = self.filter_expression.resolve(context) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", 第 670 行,解决中 obj = self.var.resolve(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 795 行,解决中 值 = self._resolve_lookup(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 836 行,在 _resolve_lookup 中 current = getattr(current, bit) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", 第 175 行,错误 self.full_clean() 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py”, 第 376 行,在 full_clean 中 self._clean_fields() 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py”, 第 388 行,在 _clean_fields value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) 文件 “/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/widgets.py”, 第 258 行,在 value_from_datadict 中 返回 data.get(name) AttributeError: 'list' 对象没有属性 'get' [20/Dec/2019 13:11:28] "GET /processos/cadastro/ HTTP/1.1" 500 215100 /home/lucas/dev/autocusto/processos/forms.py 改变,重新加载。使用 StatReloader 监视文件更改 正在执行系统检查...

系统检查未发现任何问题(0 静音)。 2019 年 12 月 20 日 - 13:13:15 Django 3.0 版,使用设置'autocusto.settings' 在http://127.0.0.1:8000/启动开发服务器退出服务器 使用 CONTROL-C。 /home/lucas/dev/autocusto/processos/views.py 改变了, 重新加载。使用 StatReloader Performing 监视文件更改 系统检查...

系统检查未发现任何问题(0 静音)。 2019 年 12 月 20 日 - 13:25:04 Django 3.0 版,使用设置'autocusto.settings' 在http://127.0.0.1:8000/启动开发服务器退出服务器 使用 CONTROL-C。 [2019 年 12 月 20 日 13:30:03] “GET / HTTP/1.1” 200 3680 不 找到:/favicon.ico ((1, 'SHAM'), (2, '65'), (3, '65asdfasdf'), (4, 'Clínica 1'), (5, 'Clínica 2'), (6, 'Clínica 3')) 内部服务器 错误:/processos/cadastro/ Traceback(最近一次调用最后一次):文件 “/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py”, 第 158 行,在 getitem 中 field = self.fields[name] KeyError: 'errors'

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件 “/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 828 行,在 _resolve_lookup 中 当前=当前[位]文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py”, 第 160 行,在 getitem 中 raise KeyError(KeyError: "在 'NovoProcesso' 中找不到关键的'错误'。选择有:altura、anamnese、cid、clinicas、 cpf_paciente,data_1,诊断,incapaz,med1,med1_posologia_mes1, nome_mae,nome_paciente,nome_responsavel,比索,qtd_med1_mes1, qtd_med1_mes2, qtd_med1_mes3, tratamentos_previos, tratou。”

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件 “/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/exception.py”, 第 34 行,在内部 response = get_response(请求)文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/base.py”, 第 115 行,在 _get_response 中 response = self.process_exception_by_middleware(e,request)文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/base.py”, 第 113 行,在 _get_response 中 response = Wrapped_callback(request, *callback_args, **callback_kwargs) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/contrib/auth/decorators.py", 第 21 行,在 _wrapped_view return view_func(request, *args, **kwargs) File "/home/lucas/dev/autocusto/processos/views.py", line 101, in cadastro 返回渲染(请求,'processos/cadastro.html',contexto)文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/shortcuts.py”, 第 19 行,在渲染中 content = loader.render_to_string(template_name, context, request, using=using) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader.py", 第 62 行,在 render_to_string 中 返回 template.render(context, request) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/backends/django.py", 第 61 行,在渲染中 返回 self.template.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 171 行,在渲染中 返回 self._render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 163 行,在 _render 中 返回 self.nodelist.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 936 行,在渲染中 bit = node.render_annotated(context) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", 第 903 行,在 render_annotated 中 返回 self.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader_tags.py”, 第 150 行,在渲染中 返回已编译的_parent._render(上下文)文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 163 行,在 _render 中 返回 self.nodelist.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 936 行,在渲染中 bit = node.render_annotated(context) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", 第 903 行,在 render_annotated 中 返回 self.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader_tags.py”, 第 62 行,在渲染中 结果 = block.nodelist.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 936 行,在渲染中 bit = node.render_annotated(context) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", 第 903 行,在 render_annotated 中 返回 self.render(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 986 行,在渲染中 输出 = self.filter_expression.resolve(context) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", 第 670 行,解决中 obj = self.var.resolve(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 795 行,解决中 值 = self._resolve_lookup(context) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”, 第 836 行,在 _resolve_lookup 中 current = getattr(current, bit) 文件 "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", 第 175 行,错误 self.full_clean() 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py”, 第 376 行,在 full_clean 中 self._clean_fields() 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py”, 第 388 行,在 _clean_fields value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) 文件 “/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/widgets.py”, 第 258 行,在 value_from_datadict 中 return data.get(name) AttributeError: 'tuple' 对象没有属性 'get'

我尝试了以下解决方案,但均未成功: Django: how to pass parameters to forms, Django Forms: pass parameter to form

不知道我错过了什么!

【问题讨论】:

我找到了错误的根源:else: formulario = NovoProcesso(escolhas) -----> 无法传递任何参数! 【参考方案1】:

可能,在 NovoProcesso 表单类或其他地方,您在导致此错误的属性定义之一的末尾有“,”。试着找出来。

你还没有发布完整的代码,但我猜你有这样的东西:

class NovoProcesso(forms.Form):
   clinicas = forms.ChoiceField(widget=forms.Select, choices=[]), <- this comma causes an error

编辑:错误地将参数传递给 init 方法,如此处所述object has no attribute 'get'

【讨论】:

以上是关于将参数传递给 django 表单的主要内容,如果未能解决你的问题,请参考以下文章

如何将从表单提交中检索到的参数作为参数传递给 django 中的函数

如何将额外的参数传递给 django admin 自定义表单?

将组合框作为参数传递给表单

Django 将自定义表单参数传递给 ModelFormset

在 Django 中将参数传递给 websocket

将参数传递给 Django 中的 ListView