【问题标题】:Django admin page autocomplete on reverse ForeignKey反向外键上的 Django 管理页面自动完成
【发布时间】:2020-07-28 05:05:39
【问题描述】:

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

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

witch 很奇怪,因为我看不出与第一个示例有任何区别。

如何解决这个问题?

【问题讨论】:

    标签: django foreign-keys django-admin autocomplete-fields


    【解决方案1】:

    assortments 在列表页面中不可见,因为您已将 list_display 设置为

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

    由于assortments 是多对多的关系,你必须编写一个自定义的ModelAdmin 来显示它们。

    in the django docs 所述,autocomplete_fields 仅适用于该模型的 FK 和 M2M 字段。在 AssetAdmin 中,您可以为 Subsidiary 字段设置自动完成。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      相关资源
      最近更新 更多