删除django admin的ForeignKey Field中的默认选择 [英] remove the default select in ForeignKey Field of django admin
问题描述
用户模型中有150k个条目。当我在django-admin中使用它而不使用raw_id_fields时,将加载所有条目作为外键选择菜单时会导致问题。是否有替代方式,以便它可以轻松加载或可以成为可搜索?
我有这些定义如上所述的模型,并有一个用户模型用作ForeignKey在ProfileRecommendation模型。用户模型的数据库条目包含大约150k个条目。我不想要这些外部字段的默认选择选项。相反,如果可以过滤掉它们,并且只加载用户表的几个条目。如何让他们可以像自动完成建议一样搜索?
admin.py
class ProfileRecommendationAdmin(admin.ModelAdmin):
list_display =('user','recommended_by','recommended_text')
raw_id_fields =(user,recommended_by)
search_fields = ['user__username','recommended_by__username',]
admin.site.register(ProfileRecommendation,ProfileRecommendationAdmin)
models.py
class ProfileRecommendation(models.Model):
user = models.ForeignKey(User, related_name ='recommendations')
recommended_by = models.ForeignKey(User,related_name ='recommended')
recommended_on = models.DateTimeField(auto_now_add = True,null = True)
recommended_text = models。 TextField(default ='')
formfield_for_foreignkey
像这样:
class ProfileRecommendationAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self,db_field,request,* * kwargs)
如果db_field.name ==user:
kwargs [queryset] = User.objects.filter(is_superuser = True)
return super(ProfileRecommendationAdmin,self) .formfield_for_foreignkey(db_field,request,** kwargs)
或者其他方法是覆盖该表单来自django.contrib的$ ad $ import $ $ $ $ $
$ $ $ $ $ $
class PersonForm(forms.ModelForm):
class Meta:
model = Person
exclude = ['name']
类PersonAdmin(admin.ModelAdmin):
exclude = ['age']
form = PersonForm
您可以更改小部件,并使用类似于具有自动完成和ajax的selectize。
There are 150k entries in User model. When i am using it in django-admin without the raw_id_fields it is causing problem while loading all the entries as a select menu of foreign key. is there alternate way so that it could be loaded easily or could become searchable?
I have these models as of defined above and there is a User model which is used as ForeignKey in ProfileRecommendation models. The database entry for user model consist of around 150k entries. I don't want default select option for these foreign fields. Instead if can filter them out and load only few entries of the user table. How I can make them searchable like autocomplete suggestion?
admin.py
class ProfileRecommendationAdmin(admin.ModelAdmin):
list_display = ('user', 'recommended_by', 'recommended_text')
raw_id_fields = ("user", 'recommended_by')
search_fields = ['user__username', 'recommended_by__username',]
admin.site.register(ProfileRecommendation, ProfileRecommendationAdmin)
models.py
class ProfileRecommendation(models.Model):
user = models.ForeignKey(User, related_name='recommendations')
recommended_by = models.ForeignKey(User, related_name='recommended')
recommended_on = models.DateTimeField(auto_now_add=True, null=True)
recommended_text = models.TextField(default='')
you can use method formfield_for_foreignkey
something like this:
class ProfileRecommendationAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "user":
kwargs["queryset"] = User.objects.filter(is_superuser=True)
return super(ProfileRecommendationAdmin,self).formfield_for_foreignkey(db_field, request, **kwargs)
or other way is to override the form for that modeladmin class
from django import forms
from django.contrib import admin
from myapp.models import Person
class PersonForm(forms.ModelForm):
class Meta:
model = Person
exclude = ['name']
class PersonAdmin(admin.ModelAdmin):
exclude = ['age']
form = PersonForm
you can change the widget and use something like the selectize with autocomplete and ajax.
这篇关于删除django admin的ForeignKey Field中的默认选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!