Подтвердить что ты не робот

Значения раскрывающегося списка фильтрации в 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 остается пустой или ''. Таким образом, выпадающий список имеет много пустого значения, потому что заголовок пуст. Я хочу отфильтровать эти пустые значения.

4b9b3361

Ответ 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

Ответ 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