Django Admin formfield_for_foreignkey for manytomany
Моя модель (упрощенная)
у нас есть туры:
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 для многих полей?
Метод formfield_for_foreignkey
работает только для полей 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, ]
Наконец-то нашел ответ здесь: 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