Django 3.2.6 |管理员 |获取表单()|修改表单字段 |错误:“NoneType”对象没有属性“base_fields”

问题描述 投票:0回答:1

我正在自定义 Django 管理表单以修改表单字段查询集。 下面的代码适用于我的一些模型,但不适用于其他模型。

模型之间的唯一区别是名称,因为它们都具有相同的字段:

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 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

管理员:

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)

当我打印(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]

异常“NoneType”对象没有属性“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

针对类似模型(目标)返回修改后的查询集的代码

型号:

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

管理员:

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)
django forms django-queryset admin python-3.8
1个回答
0
投票

您忘记了

return form
方法中的
get_form()

© www.soinside.com 2019 - 2024. All rights reserved.