Django ModelForm `fields_for_model` references `_default_manager`, which is None

Viewed 11

I am working on a Django project using standard models and ModelForms. I have the following models and forms:

# models.py

class ApplicationCore(TimestampedModel):
    user = models.ForeignKey(User, related_name="applications", on_delete=models.PROTECT)
    organization = models.ForeignKey(Organization, related_name="applications", on_delete=models.PROTECT)
    overall_status = models.TextField(choices=ApplicationOverallStatus.choices, default=ApplicationOverallStatus.in_progress.value)

    class Meta:
        abstract = True
...

class Application(ApplicationCore):
    applicant = models.OneToOneField(ApplicantInformation, null=True, on_delete=models.PROTECT)
    item_one = models.OneToOneField(ApplicationItemOne, null=True, on_delete=models.PROTECT)
    item_two = models.OneToOneField(ApplicationItemTwo, null=True, on_delete=models.PROTECT)

...


class ApplicationItemOne(ApplicationItemCore):
    choice = models.TextField(choices=ApplicationItemOneChoice.choices, null=True, blank=True)
    co_applicants = models.ForeignKey(ApplicantInformation, null=True, related_name="item_ones", on_delete=models.PROTECT)
# forms.py

class ApplicationForm(forms.ModelForm):
    has_item_one = False
    has_item_two = False

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.has_item_one = self.instance.item_one_id is not None
        self.has_item_two = self.instance.item_two_id is not None
    
    class Meta:
        model = Application
        fields = ('applicant',)

class ApplicationItemOneForm(forms.ModelForm):
    class Meta:
        model = ApplicationItemOne
        fields = '__all__'

When I try to run any Django command e.g. python manage.py makemigrations I get the following error:


File "/home/noah/dev/github/silica/silica-docs/django/sample-app/application/urls.py", line 5, in \<module\>
from application import views
File "/home/noah/dev/github/silica/silica-docs/django/sample-app/application/views.py", line 7, in \<module\>
from application.forms import CreateApplicationForm
File "/home/noah/dev/github/silica/silica-docs/django/sample-app/application/forms.py", line 19, in \<module\>
class ApplicationForm(forms.ModelForm):
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/forms/models.py", line 261, in __new__
fields = fields_for_model(
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/forms/models.py", line 183, in fields_for_model
formfield = f.formfield(\*\*kwargs)
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/db/models/fields/related.py", line 1060, in formfield
return super().formfield(\*\*kwargs)
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/db/models/fields/related.py", line 991, in formfield
'queryset': self.remote_field.model.\_default_manager.using(using),
AttributeError: 'NoneType' object has no attribute 'using'

Reading through the trace, it appears that the issue is ...model._default_manager returning None. What I can't figure out is why that is happening. It also happens if I comment out the ApplicationForm above, erroring on ApplicationItemOneForm.

Full stack trace:

Traceback (most recent call last):
File "manage.py", line 21, in \<module\>
main()
File "manage.py", line 17, in main
execute_from_command_line(sys.argv)
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
utility.execute()
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/core/management/__init__.py", line 413, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/core/management/base.py", line 354, in run_from_argv
self.execute(\*args, \*\*cmd_options)
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/core/management/base.py", line 393, in execute
self.check()
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/core/management/base.py", line 419, in check
all_issues = checks.run_checks(
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/core/checks/registry.py", line 76, in run_checks
new_errors = check(app_configs=app_configs, databases=databases)
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/core/checks/urls.py", line 13, in check_url_config
return check_resolver(resolver)
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/core/checks/urls.py", line 23, in check_resolver
return check_method()
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/urls/resolvers.py", line 416, in check
for pattern in self.url_patterns:
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/utils/functional.py", line 48, in __get__
res = instance.__dict__\[self.name\] = self.func(instance)
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/urls/resolvers.py", line 602, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/utils/functional.py", line 48, in __get__
res = instance.__dict__\[self.name\] = self.func(instance)
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/urls/resolvers.py", line 595, in urlconf_module
return import_module(self.urlconf_name)
File "/home/noah/.pyenv/versions/3.8.10/lib/python3.8/importlib/__init__.py", line 127, in import_module
return \_bootstrap.\_gcd_import(name\[level:\], package, level)
File "\<frozen importlib.\_bootstrap\>", line 1014, in \_gcd_import
File "\<frozen importlib.\_bootstrap\>", line 991, in \_find_and_load
File "\<frozen importlib.\_bootstrap\>", line 975, in \_find_and_load_unlocked
File "\<frozen importlib.\_bootstrap\>", line 671, in \_load_unlocked
File "\<frozen importlib.\_bootstrap_external\>", line 848, in exec_module
File "\<frozen importlib.\_bootstrap\>", line 219, in \_call_with_frames_removed
File "/home/noah/dev/github/silica/silica-docs/django/sample-app/config/urls.py", line 23, in \<module\>
path('', include("application.urls")),
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/urls/conf.py", line 34, in include
urlconf_module = import_module(urlconf_module)
File "/home/noah/.pyenv/versions/3.8.10/lib/python3.8/importlib/__init__.py", line 127, in import_module
return \_bootstrap.\_gcd_import(name\[level:\], package, level)
File "\<frozen importlib.\_bootstrap\>", line 1014, in \_gcd_import
File "\<frozen importlib.\_bootstrap\>", line 991, in \_find_and_load
File "\<frozen importlib.\_bootstrap\>", line 975, in \_find_and_load_unlocked
File "\<frozen importlib.\_bootstrap\>", line 671, in \_load_unlocked
File "\<frozen importlib.\_bootstrap_external\>", line 848, in exec_module
File "\<frozen importlib.\_bootstrap\>", line 219, in \_call_with_frames_removed
File "/home/noah/dev/github/silica/silica-docs/django/sample-app/application/urls.py", line 5, in \<module\>
from application import views
File "/home/noah/dev/github/silica/silica-docs/django/sample-app/application/views.py", line 7, in \<module\>
from application.forms import CreateApplicationForm
File "/home/noah/dev/github/silica/silica-docs/django/sample-app/application/forms.py", line 19, in \<module\>
class ApplicationForm(forms.ModelForm):
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/forms/models.py", line 261, in __new__
fields = fields_for_model(
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/forms/models.py", line 183, in fields_for_model
formfield = f.formfield(\*\*kwargs)
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/db/models/fields/related.py", line 1060, in formfield
return super().formfield(\*\*kwargs)
File "/home/noah/.virtualenvs/sample-app/lib/python3.8/site-packages/django/db/models/fields/related.py", line 991, in formfield
'queryset': self.remote_field.model.\_default_manager.using(using),
AttributeError: 'NoneType' object has no attribute 'using'
1 Answers

Let this be a lesson - always include all the pieces of your code relevant to your question! The issue here was that I had left in an abstract Meta tag on ApplicantInformation from a previous version of the code. Abstract classes, of course, do not have a manager because they cannot actually be instantiated.

Related