0
votes

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!

1
I've found the source of the error: else: formulario = NovoProcesso(escolhas) -----> not able to pass any arguments!Lucas Barros

1 Answers

0
votes

Probably, in NovoProcesso form class or somewhere else you have "," at the end of one of the attribute definition which causes this error. Try to find it out.

You haven't posted whole code but I guess you have something like this:

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

EDIT: Incorrectly passed arguments to the init method as described here object has no attribute 'get'