当 creating/updating 管理中的对象外键时,使用站点框架的 Django “[object] 实例不存在”错误

Django "[object] instance with id X does not exist" error when creating/updating object foreign key in admin, using sites framework

我有一个使用站点框架的 Django 应用程序。我有一个 Category 模型和一个 Topic 模型。主题模型有一个指向特定类别对象的“类别”属性。这两个模型都有“站点”属性,将它们链接到 Django 应用程序中的特定站点。所有这些网站都托管在同一台服务器上。

我注意到的是,当我 create/update 管理中的一个对象(主题)- 并将主题的外键字段(类别)设置为一个类别时 在 SITE_ID 设置中配置的站点上 - 我收到此错误消息:

category instance with id X does not exist

当我更改 settings.py 中的 SITE_ID 时,我现在可以将主题的类别设置为该站点 上的类别 ,但不能设置为任何其他站点上的类别网站。

这里有一张图表可以帮助您直观地理解这一点:

flow chart

这里有两个相关模型,类别和主题:

class Category(models.Model):
    name = models.CharField(max_length=128)
    slug = models.SlugField()
    description = RichTextUploadingField(
        blank=True,
        default='',
        verbose_name='Category Description',
        help_text='''Category description to be displayed on category page
                     goes here'''
    )
    site = models.ForeignKey(Site, on_delete=models.CASCADE)
    on_site = CurrentSiteManager()

    objects = models.Manager()

    class Meta:
        verbose_name_plural = 'categories'
        ordering = ['name']


class Topic(models.Model):
    site = models.ForeignKey(Site, on_delete=models.CASCADE)
    name = models.CharField(max_length=128)
    slug = models.SlugField()
    description = RichTextUploadingField(
        blank=True,
        default='',
        verbose_name='Topic Description',
        help_text='''Topic description to be displayed on topic page
                     goes here'''
    )
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    on_site = CurrentSiteManager()

    objects = models.Manager()

TopicAdmin 配置为检索所有站点的类别和主题:

@admin.register(Topic)
class TopicAdmin(admin.ModelAdmin):
    list_display = ['name', 'site']
    save_as = True

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'category':
            kwargs['queryset'] = Category.objects.all().order_by('name')

        return super().formfield_for_foreignkey(db_field, request, **kwargs)

    def get_queryset(self, request):
        return Topic.objects.all()

有什么想法可以让主题保存在适当的类别中吗?

我已经尝试连接到一堆不同的 ModelAdmin 方法中,但我还没有取得任何成功。

模型上定义的第一个管理器由 Django 的某些部分(包括管理员)使用,模型上的第一个管理器是 CurrentSiteManager,它将结果限制在当前站点。

为每个模型先放一个常规models.Manager,这样使用的默认管理器就不会局限于当前站点

class Category(models.Model):
    ...
    objects = models.Manager()
    on_site = CurrentSiteManager()


class Topic(models.Model):
    ...
    objects = models.Manager()
    on_site = CurrentSiteManager()