Значения раскрывающегося списка фильтрации в django admin
class Foo(models.Model):
title = models.TextField()
userid = models.IntegerField()
image = models.CharField(max_length=100)
def __unicode__(self):
return self.title
class Bar(models.Model):
foo = models.ForeignKey(Foo, related_name='Foo_picks', unique=True)
added_on = models.DateTimeField(auto_now_add=True)
В Django admin add_view:
def add_view(self, *args, **kwargs):
self.exclude = ("added_on",)
self.readonly_fields = ()
return super(Bar, self).add_view(*args, **kwargs)
Итак, поле показывает в представлении добавления администратора foo
. Это выпадающий список и показывает все заголовки. Некоторая title
of foo
остается пустой или ''. Таким образом, выпадающий список имеет много пустого значения, потому что заголовок пуст. Я хочу отфильтровать эти пустые значения.
Ответы
Ответ 1
Вы можете предоставить свою собственную форму для ModelAdmin с настраиваемым запросом для поля foo.
from django import forms
from django.contrib import admin
#Create custom form with specific queryset:
class CustomBarModelForm(forms.ModelForm):
class Meta:
model = Bar
fields = '__all__'
def __init__(self, *args, **kwargs):
super(CustomBarModelForm, self).__init__(*args, **kwargs)
self.fields['foo'].queryset = Foo.objects.filter(title__isnull=False)# or something else
# Use it in your modelAdmin
class BarAdmin(admin.ModelAdmin):
form = CustomBarModelForm
Что-то вроде этого...
docs
Ответ 2
для django 1.6:
Для внешнего ключа:
https://docs.djangoproject.com/en/1.6/ref/contrib/admin/#ModelAdmin.formfield_for_foreignkey
class MyModelAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "title":
kwargs["queryset"] = Foo.objects.filter(title__isnull=False)
return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
Ответ 3
Вы можете подклассифицировать свою собственную модель .ModelAdmin и создать настраиваемое поле для вашего ChoiceField...
class CustomForm(model.ModelForm):
class Meta:
model = Foo
foo = forms.ChoiceField(widget=forms.Select, initial=self.foo_queryset)
def foo_queryset(self):
return Foo.objects.filter(xy)...
class FooAdmin(model.ModelAdmin):
form = CustomForm
Ответ 4
Я наткнулся на этот вопрос, когда искал решение для фильтрации раскрывающихся параметров на лету в интерфейсе администратора на основе выбора в другом поле - не на основе предварительно отфильтрованный список при загрузке страницы. Решением, которое я нашел, была эта библиотека: https://github.com/digi604/django-smart-selects, которая является приложением, использующим вызовы ajax и позволяющей цепную фильтрацию на несколько уровней. Работает как прелесть для меня. -HTH