Django ModelForm `fields_for_model` ссылается на `_default_manager`, который является None
Я работаю над проектом Django, используя стандартные модели и ModelForms. У меня есть следующие модели и формы:
# 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__'
Когда я пытаюсь выполнить любую команду Django, например python manage.py makemigrations
, я получаю следующую ошибку:
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'
Прочитав трассировку, кажется, что проблема в том, что ...model._default_manager
возвращает None. Я не могу понять, почему это происходит. Это также происходит, если я закомментирую ApplicationForm
выше, ошибка возникает на ApplicationItemOneForm
.
Полная трассировка стека:
Пусть это будет уроком - всегда включайте все части кода, относящиеся к вашему вопросу! Проблема заключалась в том, что я оставил абстрактный метатег на ApplicantInformation
из предыдущей версии кода. Абстрактные классы, конечно, не имеют менеджера, потому что они не могут быть инстанцированы.