【问题标题】:remove the default select in ForeignKey Field of django admin删除 django admin 的 ForeignKey 字段中的默认选择
【发布时间】:2017-01-22 15:47:31
【问题描述】:

用户模型中有 150k 个条目。当我在没有 raw_id_fields 的 django-admin 中使用它时,在将所有条目加载为外键的选择菜单时会导致问题。是否有其他方法可以轻松加载或变得可搜索?

我有上面定义的这些模型,并且有一个 User 模型用作 ProfileRecommendation 模型中的 ForeignKey。用户模型的数据库条目由大约 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='')

【问题讨论】:

标签: python django django-forms django-admin


【解决方案1】:

你可以使用formfield_for_foreignkey方法

类似这样的:

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)

或其他方式是覆盖该模型管理类的表单

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

您可以更改小部件并使用带有自动完成和 ajax 的 selectize 之类的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-13
    • 2014-04-11
    • 2018-11-16
    • 2015-09-10
    • 2013-04-28
    • 2021-04-28
    • 2013-05-23
    • 2011-01-21
    相关资源
    最近更新 更多