0

免责声明:这是一个编辑问题,因为到目前为止我得到了一些答案。

我想在 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.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.

女巫很奇怪,因为我看不出与第一个例子有什么不同。

如何解决这个问题?

4

1 回答 1

0

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']
于 2020-04-15T14:37:58.740 回答