Django 在使用站点框架在管理员中创建/更新对象外键时"[object] instance with id X does not exist"错误



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

我注意到,当我在管理员中创建/更新对象(Topic(,并将主题的外键字段(类别(设置为不在site_ID设置中配置的站点上的类别时,我会收到以下错误消息:

id为X的类别实例不存在

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

这里有一张图表可以帮助你将其可视化:

流程图

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

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()

相关内容

最新更新