【问题标题】:Filtering ManyToMany Field in Django not working as expected过滤 Django 中的多对多字段未按预期工作
【发布时间】:2020-06-20 19:02:22
【问题描述】:

我正在使用 Django 文档 here 以及一些以前的 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,在 Django 的管理部分编辑 BakingPost 可以正常工作。

当我实现这 4 行时,在尝试编辑 BakingPost 时,我的 Category 字段的所有值都消失了,它甚至没有给我一个过滤框。

【问题讨论】:

  • 看起来很奇怪,除非您有一个与用户名同名的Category,否则这将不起作用。您的 Category 没有“所有者”字段,因此您无法过滤谁“拥有”该类别。
  • @WillemVanOnsem 我认为 Django 文档中的“所有者”是他们在“汽车”模型中创建的变量。我在复制示例时尝试输入“所有者”,但它抛出了错误,提示使用“名称”或我已经忘记的其他值。
  • @PeterDeGlopper 哦。那很容易。大声笑非常感谢您的帮助。如果您想将其添加为答案,我很乐意将其标记为答案。

标签: python django


【解决方案1】:

您可能尝试遵循的模式(例如Django filter many to many field in admin?)是为了在编辑BakingPost 时尝试限制在管理员中分配的有效类别选择。如果您尝试将多对多字段添加到管理员的“我在看什么 BakingPosts”控件,那就不同了。为此,您应该能够将类别添加到管理员的 list_filter 字段中,因为默认情况下支持 m2m 字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2018-06-07
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    相关资源
    最近更新 更多