django-nonrel exclude listfield from admin

546 Views Asked by At

I've ran into a typical problem where I have a ListField in a model.

I'd like to use the Django admin to play around with the object and the ListField isn't that crucial, it's a list of embedded objects that I can live without.

When I use this, I get the error on the main admin page. If I don't use the ModelAdmin object when registering the original Item object, I only get the error if I try to add an Item.

from django.contrib import admin

class ItemAdmin(admin.ModelAdmin):
    exclude = ('bids',)

admin.site.register(Item, ItemAdmin)

How to properly exclude the "bids" ListField then?

2

There are 2 best solutions below

3
Jonas H. On

Subclass ListField and override formfield so that it returns None.

Returning None from formfield(...) means that the field should be excluded from all forms, so you need remove the exclude = ['bids'] thing from your ModelAdmin.

Alternatively, you can make formfield(...) return a proper forms.Field subclass -- to display e.g. a text version, use something like

class Item(models.Model):
    def formfield(self, **kwargs):
        return super(Item, self).formfield(form_class=YourCustomFormField, **kwargs)

To exclude it from the admin, you can still use exclude.

https://docs.djangoproject.com/en/dev/howto/custom-model-fields/#django.db.models.Field.formfield

Put your field subclass into yourapp/fields.py.

0
Ross On

I worked round it by making my ListField non editable, as I couldnt get exclude to work for me either..

eg:

class Item(models.Model):
    created_at = models.DateTimeField(auto_now_add=True, db_index=True)
    title = models.CharField(max_length=255)
    bids = ListField(EmbeddedModelField('Bid'), editable=False)