Django管理表单field_for_foreignkey用于多个对象

vcudknz3  于 2023-02-10  发布在  Go
关注(0)|答案(2)|浏览(207)
    • bounty将在4天后过期**。回答此问题可获得+50的声誉奖励。rapsli正在寻找来自声誉良好来源的答案

我的模型(简化)
我们有旅游团:

class Tour(models.Model):
    name = models.CharField(max_length=100)
    strecke = models.ManyToManyField(Strecke, through="Streckenreihenfolge")

巡视路线包含以下部分:

class Strecke(models.Model):
    name = models.CharField(max_length=100)
    auftrag = models.ForeignKey("Auftrag", on_delete=models.CASCADE, null=True, blank=True)

各部分按顺序排列

class Streckenreihenfolge(models.Model):
    strecke = models.ForeignKey(Strecke, on_delete=models.CASCADE)
    tour = models.ForeignKey("Tour", on_delete=models.CASCADE)
    reihenfolge = models.IntegerField()

在我的管理中,我想对显示哪些部分(Strecke)进行一些限制。我考虑过使用formfield_for_foreignkey。它会被调用,但对选项没有任何影响:

@admin.register(Tour)
class TourAdmin(admin.ModelAdmin):

    class StreckenreihenfolgeAdminInline(admin.TabularInline):
        model = Streckenreihenfolge
        autocomplete_fields = ["strecke"]
        ordering = ["reihenfolge"]
        extra = 0

        def formfield_for_foreignkey(self, db_field, request, **kwargs):
            print(db_field.name)
            if db_field.name == 'strecke':
                kwargs['queryset'] = Strecke.objects.filter(auftrag_id__exact=8)
            return super().formfield_for_foreignkey(db_field, request, **kwargs)
    

inlines = [StreckenreihenfolgeAdminInline, ]

formfield_for_foreignkey不适用于多对多字段吗?

然后我尝试使用get_queryset(),它减少了查询集,但不知何故,自动完成值仍然没有过滤。
也许这张图更能说明我想要达到的目标:

qf9go6mv

qf9go6mv1#

formfield_for_foreignkey方法仅适用于外键字段。对于ManyToManyFields,您可以在内联管理中使用formfield_for_manytomany方法。

@admin.register(Tour)
class TourAdmin(admin.ModelAdmin):

    class StreckenreihenfolgeAdminInline(admin.TabularInline):
        model = Streckenreihenfolge
        autocomplete_fields = ["strecke"]
        ordering = ["reihenfolge"]
        extra = 0

        def formfield_for_manytomany(self, db_field, request, **kwargs):
            print(db_field.name)
            if db_field.name == 'strecke':
                kwargs['queryset'] = Strecke.objects.filter(auftrag_id__exact=8)
            return super().formfield_for_manytomany(db_field, request, **kwargs)

inlines = [StreckenreihenfolgeAdminInline, ]
vq8itlhq

vq8itlhq2#

终于在这里找到了答案:https://forum.djangoproject.com/t/django-admin-autocomplete-field-search-customization/7455/5
这将生成以下代码:

@admin.register(Strecke)
class StreckeAdmin(admin.ModelAdmin):
    search_fields = ["name"]

    def get_search_results(self, request, queryset, search_term):
        print("get serach results")
        queryset = queryset.filter(auftrag_id__exact=8)
        qs = super().get_search_results(request, queryset, search_term)
        print(qs)
        return qs

相关问题