ForeignKey显示
情景:Model 外键了user,后台想在列表里显示username
list_display = ("username", "xx", ...)
def username(self, obj):
return obj.user.username
username.short_description = "Show User's username."
ForeignKey所在表字段过多
Django的admin会默认生成一个可选择外键的下拉列表,也就意味着它会SELECT整张表,如果这个外键表过大会造成浏览器迟迟无法刷新
- 解决方法一:
取消下拉列表 ==> admin里加个字段
raw_id_fields = ('foreignkey', ...)
- 解决方法二:
减小下拉列表的搜索范围 ==> 重写form
省市县,三级分开
class xxxForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['province'].queryset = Areas.objects.filter(LevelType=1)
self.fields['city'].queryset = Areas.objects.filter(LevelType=2)
self.fields['district'].queryset = Areas.objects.filter(LevelType=3)
class Meta:
model = BusinessCircle
fields = '__all__'
- 解决方法三:
一劳永逸的定制formfield_for_foreignkey方法,新写插件ChainedWidget
该方法原封装在BaseModelAdmin下
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name in ["province", "city", "district"]:
return db_field.formfield(widget=ChainedWidget())
return super().formfield_for_foreignkey(
db_field, request, **kwargs)
但是具体的呢我还没看懂……等研究完再更新