当 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()
我有一个使用站点框架的 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()