django - 将参数传递给 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
不知道我错过了什么!
解决方案
可能,在 NovoProcesso 表单类或其他地方,您在导致此错误的属性定义之一的末尾有“,”。试着找出来。
你还没有发布完整的代码,但我猜你有这样的东西:
class NovoProcesso(forms.Form):
clinicas = forms.ChoiceField(widget=forms.Select, choices=[]), <- this comma causes an error
编辑:错误地将参数传递给init方法,如此处所述对象没有属性“get”
推荐阅读
- php - 在php上加密用户ID的最安全方法
- ios - 限制密码自动填充并记住特定应用程序的密码
- laravel - 如何在 laravel 的搜索结果页面上创建和使用过滤器?
- javascript - 填充:'origin' 属性不适用于我的图表
- powershell - IP 地址上的 Powershell 脚本
- mongodb - 如何修复geojson以满足mongodb 2dsphere索引的需求
- cql - Cassandra:多表与物化视图
- sql - 如何根据行值将列总数添加到我的 oracle 视图中
- python - `hookwrapper` 对`py.test` 钩子意味着什么?
- eclipse - 在 Eclipse 产品中指定默认主题不起作用