Я использую 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 работает нормально.
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.
Без фильтра