开发者

filtering dropdown values in 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)

In 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)

So, Field shows in the admin add view is foo Which is a drop down list and shows all the titles. Some title of Foo remains empty or ''. So, drop down list have lots of empty value because it title is empty. I want to filter out those empty values.


You can provide your own form for ModelAdmin, with custom queryset for foo field.

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

Something like this...

docs


for django 1.6:

For foreign key: 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)


I stumbled across this question when looking for a solution to filter dropdown options on the fly in the admin interface based on the selection in another field -- not based on a pre-filtered list at page load. The solution I found was this library: https://github.com/digi604/django-smart-selects which is an app that uses ajax calls and allows chain filtering to multiple levels. Works like a charm for me. -HTH


You could subclass your own model.ModelAdmin and create a custom field for your 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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜