Django Админка страницы автозаполнения при обратном ForeignKey - PullRequest
0 голосов
/ 15 апреля 2020

Disclamer : Это вопрос редактирования, потому что я получил некоторые ответы до сих пор.

Я хотел бы создать поле автозаполнения в InlineModelAdmin, с поведением, аналогичным autocomplete_fields. Я знаю, Django изначально поддерживает это только на ForeignKey, но мне нужно это на обратной стороне.

Есть ли способ - или библиотека, которая могла бы сделать это?

Я смотрю на:

https://django-autocomplete-light.readthedocs.io/en/master/tutorial.html

https://django-grappelli.readthedocs.io/en/latest/customization.html

https://django-admin-autocomplete-all.readthedocs.io/en/latest/readme.html

Но я не нашел эту функцию ...

Предыдущий код вопроса:


У меня есть такие модели:

Модели

class Customer(models.Model):

    customer_ref = models.CharField(unique=True, max_length=50)
    name = models.CharField(null=False, max_length=80)
    country = models.CharField(null=True, max_length=50)



class Assortment(models.Model):

    name = models.CharField(null=False, max_length=50)
    customers = models.ManyToManyField(Customer, related_name='assortments', blank=True)
    products = models.ManyToManyField(Product, related_name='assortments', blank=True)


class Subsidiary(models.Model):

    subsidiary_ref = models.CharField(unique=True, max_length=50)
    name = models.CharField(null=False, max_length=80)
    address = models.TextField(null=True)
    city = models.CharField(null=True, max_length=50)
    coordinates_x = models.DecimalField(null=True, decimal_places=2, max_digits=6)
    coordinates_y = models.DecimalField(null=True, decimal_places=2, max_digits=6)
    phone_number = models.CharField(null=True, max_length=50)
    frequency = models.ForeignKey(Frequency, on_delete=models.SET_NULL, null=True)
    channel = models.CharField(null=True, blank=True, max_length=50)
    subchannel = models.CharField(null=True, blank=True, max_length=50)

    user = models.ForeignKey(User, related_name='subsidiaries', on_delete=models.SET_NULL, null=True)
    day_planned = models.BooleanField(default=False)

    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='subsidiaries')





class Asset(models.Model):

    identification = models.CharField(unique=True, max_length=50)
    serial = models.CharField(max_length=50)
    name = models.CharField(null=True, max_length=50)

    subsidiary = models.ForeignKey(Subsidiary, related_name='assets', null=True, blank=True, on_delete=models.DO_NOTHING)

Admin

@admin.register(Customer)
class CustomerAdmin(admin.ModelAdmin):
    list_display = ['customer_ref', 'name', 'country']
    list_filter = ['country']
    autocomplete_fields = ['assortments']


@admin.register(Subsidiary)
class SubsidiaryAdmin(admin.ModelAdmin):
    exclude = ['day_planned']
    list_display = ['subsidiary_ref', 'customer', 'name', 'address', 'phone_number', 'frequency', 'user']
    list_editable = ['frequency', 'user']
    list_filter = ['frequency', 'user']
    search_fields = ['subsidiary_ref', 'customer__name', 'name']
    autocomplete_fields = ['assets']

CustomerAdmin «работает» без ошибок, но поле «ассортименты» не отображается.

SubsidiaryAdmin выдает ошибку:

<class 'mobileapp.admin.SubsidiaryAdmin'>: (admin.E038) The value of 'autocomplete_fields[0]' must be a foreign key or a many-to-many field.

, ведьма странная, потому что я не вижу никаких отличий от первого примера.

Как это исправить?

1 Ответ

0 голосов
/ 15 апреля 2020

assortments не отображается на странице списка, поскольку для list_display установлено значение

list_display = ['customer_ref', 'name', 'country']

Поскольку assortments - это отношение «многие ко многим», необходимо написать собственный ModelAdmin для отображения их.

Как уже упоминалось в django документах , autocomplete_fields работает только для полей FK & M2M этой модели. В AssetAdmin вы можете установить автозаполнение для дочернего поля.

@admin.register(Asset)
class AssetAdmin(admin.ModelAdmin):
    autocomplete_fields = ['subsidiary']
...