【发布时间】: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 哦。那很容易。大声笑非常感谢您的帮助。如果您想将其添加为答案,我很乐意将其标记为答案。