#Programming Error on listing User if database is empty

8 messages · Page 1 of 1 (latest)

real kraken
#

I added the following 'filter_owner' field to forms.py , to manage the owner of an item. I tried both
get_user_model() and direct User() to list users.


class CompteFilterForm(forms.Form):

    users = User.objects.exclude(is_superuser=True)
    users_choices = [(user.pk, user.get_username()) for user in users]
    users_choices.insert(0, ('', 'pas de filtre'))
    users_choices.insert(1, ('orphelins', '-- orphelins --'))

    # OWNED_BY
    filter_owner = forms.ChoiceField(
        choices=users_choices,
        widget=forms.Select(attrs={
            'class': 'form-control',
            'type': 'text',
        }),
        label='En charge'
    )

#

That works for existing instances of the Django app, but for blank, new containers with an empty database,
it gives me an error:

web5       |   File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
web5       |   File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
web5       |   File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked
web5       |   File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
web5       |   File "<frozen importlib._bootstrap_external>", line 940, in exec_module
web5       |   File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
web5       |   File "/home/dcrm/web/website/urls.py", line 3, in <module>
web5       |     from . import views
web5       |   File "/home/dcrm/web/website/views.py", line 52, in <module>
web5       |     from .forms import (
web5       |   File "/home/dcrm/web/website/forms.py", line 430, in <module>
web5       |     class CompteFilterForm(forms.Form):
web5       |   File "/home/dcrm/web/website/forms.py", line 433, in CompteFilterForm
web5       |     users_choices = [(user.pk, user.get_username()) for user in users]
web5       |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#
web5       |   File "/usr/local/lib/python3.11/site-packages/django/db/models/query.py", line 400, in __iter__
web5       |     self._fetch_all()
web5       |   File "/usr/local/lib/python3.11/site-packages/django/db/models/query.py", line 1928, in _fetch_all
web5       |     self._result_cache = list(self._iterable_class(self))
web5       |                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web5       |   File "/usr/local/lib/python3.11/site-packages/django/db/models/query.py", line 91, in __iter__
web5       |     results = compiler.execute_sql(
web5       |               ^^^^^^^^^^^^^^^^^^^^^
web5       |   File "/usr/local/lib/python3.11/site-packages/django/db/models/sql/compiler.py", line 1562, in execute_sql
web5       |     cursor.execute(sql, params)
web5       |   File "/usr/local/lib/python3.11/site-packages/django/db/backends/utils.py", line 79, in execute
web5       |     return self._execute_with_wrappers(
web5       |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web5       |   File "/usr/local/lib/python3.11/site-packages/django/db/backends/utils.py", line 92, in _execute_with_wrappers
web5       |     return executor(sql, params, many, context)
web5       |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web5       |   File "/usr/local/lib/python3.11/site-packages/django/db/backends/utils.py", line 100, in _execute
web5       |     with self.db.wrap_database_errors:
web5       |   File "/usr/local/lib/python3.11/site-packages/django/db/utils.py", line 91, in __exit__
web5       |     raise dj_exc_value.with_traceback(traceback) from exc_value
web5       |   File "/usr/local/lib/python3.11/site-packages/django/db/backends/utils.py", line 105, in _execute
#
web5       |     return self.cursor.execute(sql, params)
web5       |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web5       | django.db.utils.ProgrammingError: relation "auth_user" does not exist
web5       | LINE 1: ...user"."is_active", "auth_user"."date_joined" FROM "auth_user...

I am unsure where to check first, is the forms.py field correctly defined ?

steep vessel
#

Your problem is that you can't run code like that at class definition. Where you've written it, it runs when the forms are first imported

#

Instead, you need to define your field with no choices, and then set the choices in the form's __init__

#

Something like this, though this is off the top of my head and typed into Discord so may not be 100% correct: ```python
class CompteFilterForm(forms.Form):
# OWNED_BY
filter_owner = forms.ChoiceField(
choices=[],
widget=forms.Select(attrs={
'class': 'form-control',
'type': 'text',
}),
label='En charge'
)

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)

    users = User.objects.exclude(is_superuser=True)
    users_choices = [(user.pk, user.get_username()) for user in users]
    users_choices.insert(0, ('', 'pas de filtre'))
    users_choices.insert(1, ('orphelins', '-- orphelins --'))
    self.fields["filter_owner"].choices = users_choices
real kraken
#

oh 😅