Фильтрация поля ManyToMany в Django не работает должным образом - PullRequest
0 голосов
/ 20 июня 2020

Я использую Django docs здесь , а также некоторые предыдущие вопросы StackOverflow, чтобы понять это, но я не могу заставить его работать. Моя цель - иметь возможность фильтровать модели на основе ManyToManyField. Я следовал руководству Mozilla Django, чтобы зайти так далеко, но оно не отфильтровывалось по ManyToManyField (в моем случае - по категории), поэтому я хотел добавить это.

models.py

from django.conf import settings
from django.db import models
from django.utils import timezone

class Category(models.Model):
    name = models.CharField(max_length=200, help_text='Enter a category')

    def __str__(self):
        return self.name

class BakingPost(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    description = models.TextField(max_length=1000)
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)
    notes = models.TextField(max_length=1000, blank=True, null=True)
    ingredients = models.TextField(max_length=1000, blank=True, null=True)
    instructions = models.TextField(max_length=1000, blank=True, null=True)
    category = models.ManyToManyField(Category, help_text='Select a category')

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

    def display_category(self):
        return ', '.join(category.name for category in self.category.all())

    display_category.short_description = "Category"

admin.py

from django.contrib import admin
from .models import BakingPost, Category

# admin.site.register(BakingPost)
# admin.site.register(Category)


@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    pass


@admin.register(BakingPost)
class BakingPostAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'created_date', 'published_date', 'display_category')
    list_filter = ('created_date', 'published_date')  # i want to be able to filter by category here too

    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "category":
            kwargs["queryset"] = Category.objects.filter(name=request.user)
        return super().formfield_for_manytomany(db_field, request, **kwargs)

Без formfield_for_manytomany прямо выше редактирование BakingPost в разделе администратора Django работает нормально. As expected

When I implement those 4 lines, all my values for the Category field disappear when trying to edit a BakingPost and it doesn't even give me a filter box. Here's what I mean Без фильтра

1 Ответ

0 голосов
/ 20 июня 2020

Шаблон, которому вы, возможно, пытаетесь следовать (например, Django фильтровать поле «многие ко многим» в админке? ), предназначен для попытки ограничить выбор категорий, которые можно назначить в админке при редактировании BakingPost. Другое дело, если вы пытаетесь добавить поле «многие-ко-многим» к элементам управления администратора «что BakingPost я смотрю». Для этого вам нужно просто добавить категорию в поле администратора list_filter, поскольку in по умолчанию поддерживает поля m2m.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...