Django 3.2.6 | Admin | get_form() | Modify Form Field | Error: 'NoneType' object has no attribute 'base_fields'
Я настраиваю свои формы Django Admin, чтобы изменить кверисет поля формы. Приведенный ниже код работает на некоторых из моих моделей, но не на других.
Единственное различие между моделями - это название, поскольку все они имеют одинаковые поля:
Club = models.ForeignKey('configuration.Club', on_delete=models.SET_NULL, null = True, blank=True)
Title = models.CharField(max_length=30, blank=False)
Description = models.CharField(max_length=120, blank=True)
Код, который преодолевает исключение (Trophy)
Модель:
class Trophy(models.Model):
Club = models.ForeignKey('configuration.Club', on_delete=models.SET_NULL, null = True, blank=True)
Title = models.CharField(max_length=120, blank=False, unique=True)
Description = models.CharField(max_length=360, blank=False, unique=True)
class Meta:
ordering = ['Title', 'Club']
unique_together = ['Title', 'Club']
def __str__(self):
return self.Title
Admin:
class TrophyView(admin.ModelAdmin):
list_display = ('id', 'Club', 'Title', 'Description')
#Modify Form
def get_form(self, request, obj=None, **kwargs):
#Get User's Profile >> Club
user = request.user
profile = vMemberDetails.objects.get(username=user.username)
club = profile.Club_pk
clubID = Club.objects.filter(id=club)
#Super
form = super(TrophyView, self).get_form(request, obj, **kwargs)
form.base_fields['Club'].queryset = clubID
#Modify View
def get_queryset(self, request):
qs = super(admin.ModelAdmin, self).get_queryset(request)
user = request.user
profile = vMemberDetails.objects.get(username=user.username)
club = profile.Club_pk
clubID = Club.objects.get(id=club)
profiles = vMemberDetails.objects.filter(Club_pk=clubID.pk)
if request.user.is_superuser:
return qs
else:
return qs.filter(Club=clubID.pk) | qs.filter(Club__isnull=True)
admin.site.register(Trophy,TrophyView)
Когда я print(form.base_fields):
{'Club': django.forms.models.ModelChoiceField object at 0x000001E3895D6AF0,
'Title': django.forms.fields.CharField object at 0x000001E3895D6A60,
'Description':django.forms.fields.CharField object at 0x000001E3895D6D30}
Когда я print(form.base_fields['Club'].queryset):
QuerySet [Club: Test_001 Club, Club: Test_002]
Exception 'NoneType' object has no attribute 'base_fields':
AttributeError at /admin/configuration/trophy/add/
'NoneType' object has no attribute 'base_fields'
Request Method: GET
Request URL: http://localhost:8000/admin/configuration/trophy/add/
Django Version: 3.2.6
Exception Type: AttributeError
Exception Value:
'NoneType' object has no attribute 'base_fields'
Python Version: 3.8.11
Код, который возвращает модифицированный кверсет против аналогичной модели (Target)
Модель:
class Target(models.Model):
Club = models.ForeignKey('configuration.Club', on_delete=models.SET_NULL, null = True, blank=True)
Title = models.CharField(max_length=30, blank=False)
Description = models.CharField(max_length=120, blank=True)
class Meta:
ordering = ['Title']
unique_together = ['Title', 'Club']
def __str__(self):
return self.Title
Admin:
class TargetView(admin.ModelAdmin):
list_display = ('id', 'Club', 'Title', 'Description')
#Modify Form
def get_form(self, request, obj=None, **kwargs):
user = request.user
profile = vMemberDetails.objects.get(username=user.username)
club = profile.Club_pk
clubID = Club.objects.filter(id=club)
#Super
form = super(TargetView, self).get_form(request, obj, **kwargs)
form.base_fields['Club'].queryset = clubID
return form
#Modify View
def get_queryset(self, request):
#Get User's Profile >> Club
qs = super(admin.ModelAdmin, self).get_queryset(request)
user = request.user
profile = vMemberDetails.objects.get(username=user.username)
club = profile.Club_pk
clubID = Club.objects.get(id=club)
profiles = vMemberDetails.objects.filter(Club_pk=clubID.pk)
if request.user.is_superuser:
return qs
else:
return qs.filter(Club=clubID.pk) | qs.filter(Club__isnull=True)
admin.site.register(Target,TargetView)