I need to dynamically create a choice field in Django Form (not ModelForm) using the logged user as a parameter.
The view:
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)
Form class:
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....
I incorrectly passed arguments to the init method as described here: object has no attribute 'get'
I'm having trouble to understand the line: self.fields['clinicas'].choices = escolhas
Not sure if I should write self.fields['clinicas].choices or . widget.... not sure how to write de form field inside the class. Tried several variations.
I'm getting the following error:
Internal Server Error: /processos/cadastro/ Traceback (most recent call last): File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", line 158, in getitem field = self.fields[name] KeyError: 'errors'
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 828, in _resolve_lookup current = current[bit] File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", line 160, in getitem raise KeyError( KeyError: "Key 'errors' not found in 'NovoProcesso'. Choices are: altura, anamnese, cid, clinicas, cpf_paciente, data_1, diagnostico, incapaz, med1, med1_posologia_mes1, nome_mae, nome_paciente, nome_responsavel, peso, qtd_med1_mes1, qtd_med1_mes2, qtd_med1_mes3, tratamentos_previos, tratou."
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner response = get_response(request) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response response = self.process_exception_by_middleware(e, request) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view return view_func(request, *args, **kwargs) File "/home/lucas/dev/autocusto/processos/views.py", line 101, in cadastro return render(request, 'processos/cadastro.html', contexto) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/shortcuts.py", line 19, in render content = loader.render_to_string(template_name, context, request, using=using) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader.py", line 62, in render_to_string return template.render(context, request) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/backends/django.py", line 61, in render return self.template.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 171, in render return self._render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 163, in _render return self.nodelist.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 936, in render bit = node.render_annotated(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 903, in render_annotated return self.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render return compiled_parent._render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 163, in _render return self.nodelist.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 936, in render bit = node.render_annotated(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 903, in render_annotated return self.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render result = block.nodelist.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 936, in render bit = node.render_annotated(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 903, in render_annotated return self.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 986, in render output = self.filter_expression.resolve(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 670, in resolve obj = self.var.resolve(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 795, in resolve value = self._resolve_lookup(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 836, in _resolve_lookup current = getattr(current, bit) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", line 175, in errors self.full_clean() File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", line 376, in full_clean self._clean_fields() File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", line 388, in _clean_fields value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/widgets.py", line 258, in value_from_datadict return data.get(name) AttributeError: 'tuple' object has no attribute 'get' [20/Dec/2019 13:09:03] "GET /processos/cadastro/ HTTP/1.1" 500 215106 /home/lucas/dev/autocusto/processos/views.py changed, reloading. Watching for file changes with StatReloader Performing system checks...
System check identified no issues (0 silenced). December 20, 2019 - 13:11:10 Django version 3.0, using settings 'autocusto.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. /home/lucas/dev/autocusto/processos/forms.py changed, reloading. Watching for file changes with StatReloader Performing system checks...
System check identified no issues (0 silenced). December 20, 2019 - 13:11:24 Django version 3.0, using settings 'autocusto.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. [(1, 'SHAM'), (2, '65'), (3, '65asdfasdf'), (4, 'Clínica 1'), (5, 'Clínica 2'), (6, 'Clínica 3')] Internal Server Error: /processos/cadastro/ Traceback (most recent call last): File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", line 158, in getitem field = self.fields[name] KeyError: 'errors'
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 828, in _resolve_lookup current = current[bit] File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", line 160, in getitem raise KeyError( KeyError: "Key 'errors' not found in 'NovoProcesso'. Choices are: altura, anamnese, cid, clinicas, cpf_paciente, data_1, diagnostico, incapaz, med1, med1_posologia_mes1, nome_mae, nome_paciente, nome_responsavel, peso, qtd_med1_mes1, qtd_med1_mes2, qtd_med1_mes3, tratamentos_previos, tratou."
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner response = get_response(request) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response response = self.process_exception_by_middleware(e, request) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view return view_func(request, *args, **kwargs) File "/home/lucas/dev/autocusto/processos/views.py", line 101, in cadastro return render(request, 'processos/cadastro.html', contexto) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/shortcuts.py", line 19, in render content = loader.render_to_string(template_name, context, request, using=using) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader.py", line 62, in render_to_string return template.render(context, request) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/backends/django.py", line 61, in render return self.template.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 171, in render return self._render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 163, in _render return self.nodelist.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 936, in render bit = node.render_annotated(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 903, in render_annotated return self.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render return compiled_parent._render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 163, in _render return self.nodelist.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 936, in render bit = node.render_annotated(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 903, in render_annotated return self.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render result = block.nodelist.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 936, in render bit = node.render_annotated(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 903, in render_annotated return self.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 986, in render output = self.filter_expression.resolve(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 670, in resolve obj = self.var.resolve(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 795, in resolve value = self._resolve_lookup(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 836, in _resolve_lookup current = getattr(current, bit) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", line 175, in errors self.full_clean() File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", line 376, in full_clean self._clean_fields() File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", line 388, in _clean_fields value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/widgets.py", line 258, in value_from_datadict return data.get(name) AttributeError: 'list' object has no attribute 'get' [20/Dec/2019 13:11:28] "GET /processos/cadastro/ HTTP/1.1" 500 215100 /home/lucas/dev/autocusto/processos/forms.py changed, reloading. Watching for file changes with StatReloader Performing system checks...
System check identified no issues (0 silenced). December 20, 2019 - 13:13:15 Django version 3.0, using settings 'autocusto.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. /home/lucas/dev/autocusto/processos/views.py changed, reloading. Watching for file changes with StatReloader Performing system checks...
System check identified no issues (0 silenced). December 20, 2019 - 13:25:04 Django version 3.0, using settings 'autocusto.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. [20/Dec/2019 13:30:03] "GET / HTTP/1.1" 200 3680 Not Found: /favicon.ico ((1, 'SHAM'), (2, '65'), (3, '65asdfasdf'), (4, 'Clínica 1'), (5, 'Clínica 2'), (6, 'Clínica 3')) Internal Server Error: /processos/cadastro/ Traceback (most recent call last): File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", line 158, in getitem field = self.fields[name] KeyError: 'errors'
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 828, in _resolve_lookup current = current[bit] File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", line 160, in getitem raise KeyError( KeyError: "Key 'errors' not found in 'NovoProcesso'. Choices are: altura, anamnese, cid, clinicas, cpf_paciente, data_1, diagnostico, incapaz, med1, med1_posologia_mes1, nome_mae, nome_paciente, nome_responsavel, peso, qtd_med1_mes1, qtd_med1_mes2, qtd_med1_mes3, tratamentos_previos, tratou."
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner response = get_response(request) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response response = self.process_exception_by_middleware(e, request) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view return view_func(request, *args, **kwargs) File "/home/lucas/dev/autocusto/processos/views.py", line 101, in cadastro return render(request, 'processos/cadastro.html', contexto) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/shortcuts.py", line 19, in render content = loader.render_to_string(template_name, context, request, using=using) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader.py", line 62, in render_to_string return template.render(context, request) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/backends/django.py", line 61, in render return self.template.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 171, in render return self._render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 163, in _render return self.nodelist.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 936, in render bit = node.render_annotated(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 903, in render_annotated return self.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render return compiled_parent._render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 163, in _render return self.nodelist.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 936, in render bit = node.render_annotated(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 903, in render_annotated return self.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render result = block.nodelist.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 936, in render bit = node.render_annotated(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 903, in render_annotated return self.render(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 986, in render output = self.filter_expression.resolve(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 670, in resolve obj = self.var.resolve(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 795, in resolve value = self._resolve_lookup(context) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/template/base.py", line 836, in _resolve_lookup current = getattr(current, bit) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", line 175, in errors self.full_clean() File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", line 376, in full_clean self._clean_fields() File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/forms.py", line 388, in _clean_fields value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) File "/home/lucas/dev/.virtualenvs/autocusto/lib/python3.8/site-packages/django/forms/widgets.py", line 258, in value_from_datadict return data.get(name) AttributeError: 'tuple' object has no attribute 'get'
I've tried the following solutions with no success: Django: how to pass parameters to forms, Django Forms: pass parameter to form
Don't know what I'm missing!