首页 > 解决方案 > 将参数传递给 django 表单

问题描述

我需要使用登录的用户作为参数在 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 方法,如此处所述: 对象没有属性'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 current = current[ bit] 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py”,第 160 行,在getitem 中引发KeyError (KeyError:“Key 'errors'在 'NovoProcesso' 中找不到。选择有:altura、anamnese、cid、clinicas、cpf_paciente、data_1、diagnostico、incapaz、med1、med1_posologia_mes1、nome_mae、nome_paciente、nome_responsavel、比索、qtd_med1_mes1、qtd_med1_mes2、qtd_med1_mes3、tratamentos

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

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(名称) 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 监视文件更改正在执行系统检查... 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: 'tuple' 对象没有属性 'get' [20/Dec/2019 13:09:03] "GET /processos/cadastro/HTTP/1.1" 500 215106 /home/lucas/dev/autocusto/processos/views。 py 改变,重新加载。使用 StatReloader 监视文件更改正在执行系统检查... 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: 'tuple' 对象没有属性 'get' [20/Dec/2019 13:09:03] "GET /processos/cadastro/HTTP/1.1" 500 215106 /home/lucas/dev/autocusto/processos/views。 py 改变,重新加载。使用 StatReloader 监视文件更改正在执行系统检查... 重新加载。使用 StatReloader 监视文件更改正在执行系统检查... 重新加载。使用 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 监视文件更改正在执行系统检查...

系统检查未发现任何问题(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, '临床 1'), (5, '临床 2'), (6, '临床 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 current = current[ bit] 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py”,第 160 行,在getitem 中引发KeyError (KeyError:“Key 'errors'在 'NovoProcesso' 中找不到。选择有:altura、anamnese、cid、clinicas、cpf_paciente、data_1、diagnostico、incapaz、med1、med1_posologia_mes1、nome_mae、nome_paciente、nome_responsavel、比索、qtd_med1_mes1、qtd_med1_mes2、qtd_med1_mes3、tratamentos

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

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(名称)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 监视文件更改正在执行系统检查...

系统检查未发现任何问题(0 静音)。2019 年 12 月 20 日 - 13:25:04 Django 版本 3.0,使用设置 'autocusto.settings' 在http://127.0.0.1:8000/启动开发服务器使用 CONTROL-C 退出服务器。[20/Dec/2019 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 current = current[ bit] 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py”,第 160 行,在getitem 中引发KeyError (KeyError:“Key 'errors'在 'NovoProcesso' 中找不到。选择有:altura、anamnese、cid、clinicas、cpf_paciente、data_1、diagnostico、incapaz、med1、med1_posologia_mes1、nome_mae、nome_paciente、nome_responsavel、比索、qtd_med1_mes1、qtd_med1_mes2、qtd_med1_mes3、tratamentos

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

回溯(最后一次调用):文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/exception.py”,第 34 行,内部响应 = get_response(request) 文件“/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、请求)文件“/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 返回 view_func(请求,*args,**kwargs)文件“/home/lucas/dev/autocusto/processos/views.py”,第 101 行,在 cadastro 返回渲染(请求,'processos/cadastro.html',contexto)文件“/home/lucas/dev/.virtualenvs/autocusto/ lib/python3.8/site-packages/django/shortcuts.py”,第 19 行,在渲染内容 = 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 return self.nodelist.render(context ) 文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”,第 936 行,在渲染位 = 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(context) 文件“/home/lucas/dev/.virtualenvs/autocusto /lib/python3.8/site-packages/django/template/base.py”,第 163 行,在 _render 中返回 self.nodelist。渲染(上下文)文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”,第 936 行,在渲染位 = 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 行,在渲染位 = node.render_annotated(context) 文件“/home/lucas/dev/.virtualenvs /autocusto/lib/python3.8/site-packages/django/template/base.py”,第 903 行,在 render_annotated 中返回 self。渲染(上下文)文件“/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py”,第 986 行,在渲染输出 = self.filter_expression.resolve(上下文)文件“/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 行,错误自我。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(名称)AttributeError:'tuple'对象没有属性'get'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: 'tuple' object has no attribute 'get'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: 'tuple' object has no attribute 'get'

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

不知道我错过了什么!

标签: djangodjango-forms

解决方案


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

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

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

编辑:错误地将参数传递给init方法,如此处所述对象没有属性“get”


推荐阅读