Django:无法在管理界面将ForeignKey值设置为None

0 投票
2 回答
726 浏览
提问于 2025-04-15 19:01

我有一个叫做 Category 的模型,它里面有一个指向 SimplePage 模型的外键。这里的 nullblank 都设置为 True。问题是,当我在管理界面编辑 Category 时,我无法把这个外键改成 ---------(这看起来像是管理界面表示“无”的方式)。一开始这个值可以是 None,我可以通过管理界面把它改成一个实际的值,也可以改成另一个值,但一旦它有了实际的值,我就不能再把它改回 None 了。(通过管理界面来说。)

这是为什么呢?

更新:

这是 models.py 的代码:

from django.db import models
import tinymce.models
from photologue.models import Photo

from django.utils.translation import ugettext_lazy as _
import multilingual

class SimplePage(models.Model):

    slug = models.SlugField(
        _('Slug'),
        unique=True,
        help_text=_('''Unique identifier for URL. Only letters, digits, and -.\
e.g. history-oct-2000 or about''')
    )

    category = models.ForeignKey('Category',
                                 related_name='items_including_main_page',
                                 blank=True, null=True)

    class Translation(multilingual.Translation):
        title = models.CharField(_('Title'), max_length=42)
        content = tinymce.models.HTMLField(_('Content'), blank=True)

    class Admin:
        list_display = ('title',)
        search_fields = ('title', 'content')

    class Meta:
        verbose_name = _('Simple page')
        verbose_name_plural = _('Simple pages')

    __unicode__ = lambda self: self.title


class Category(models.Model):
    main_page = models.OneToOneField(
        SimplePage,
        related_name='_SimplePage__category_which_has_this_as_title', 
        blank=True,
        null=True)

    get_title = lambda self: self.main_page.title if self.main_page else u''

    get_items = lambda self: \
        self.items_including_main_page.exclude(id__exact=self.main_page.id)

    __unicode__ = lambda self: self.get_title() or u'Titleless Category'

    class Admin:
        pass

    class Meta:
        verbose_name = _('Category')
        verbose_name_plural = _('Categories')

还有 admin.py

from sitehelpers.models import *
from django.contrib import admin
import multilingual

class SimplePageAdmin(multilingual.ModelAdmin):
    pass

admin.site.register(SimplePage, SimplePageAdmin)

admin.site.register(Category)

2 个回答

0

gruszczy说得对,o2o(即一对一)关系的每一方在被赋值后都不能是空的,因为Django不允许数据库中存在孤立的对象。

2

可能是因为你在分类(category)中也定义了一个一对一的关系,所以你无法打破这个关系。试着把这个关系去掉,看看你是否可以把SimplePage中的分类设置为“无”(None)。

撰写回答