【问题标题】:Django: Can't set ForeignKey value to None from adminDjango:无法从管理员将 ForeignKey 值设置为 None
【发布时间】:2010-02-08 10:20:26
【问题描述】:

我有一个模型类别,它有一个指向 SimplePage 模型的 ForeignKey。 nullblank 设置为 True。问题是,当我从管理界面编辑类别时,我无法将 ForeignKey 更改为 --------- (这看起来像是管理员说 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)

【问题讨论】:

  • 除非您向我们展示一些代码,否则我们怎么知道原因?
  • 哪个版本的 django?
  • 1.1(这里填字符因为我必须)
  • 请粘贴一些代码(模型和管理员的相关部分)

标签: python django orm


【解决方案1】:

这可能是因为您在类别中也定义了 OneToOne 关系,因此您不能打破这种关系。尝试删除它,看看是否可以将 SimplePage 中的类别设置为无。

【讨论】:

  • 我想我在最初的问题中传达错误:我无法更改为None 的关系是类别中的 OneToOneField,而不是另一个。另外,我现在确认我可以通过manage.py shell 更改它,但仍然不能通过管理员。
  • 在下面的答案中,您不能将 OneToOne 关系更改为 None。因此,无论哪种方式,您都不能从管理员中的任何模型将值更改为无。也许管理员会为此执行验证,这就是它不允许您更改它的原因。无论如何,一方面有 ForeignKey 而另一方面有 OneToOne 并不是一个好方法。
  • 你能提出一个不同的架构吗?每个类别都有一个 SimplePage 作为其主页,还有一堆 SimplePages 作为项目。你会怎么做?
  • 嗯.. Category 有 ForeignKey 到主页,ManyToMany 到其他页面怎么样?您还需要在保存中编写一些验证,但我相信这应该可行。
  • 当我在保存中写验证时,通过管理员保存时是否也会验证? (并给出一个用户友好的错误信息?)
【解决方案2】:

上面的gruszczy是对的,o2o关系的每一边在分配后都不能为空,因为django不会让你在DB中有孤儿对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2019-03-13
    相关资源
    最近更新 更多