我正在自定义 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)
您忘记了
return form
方法中的 get_form()
。