1

Sitesフレームフォークに含まれるモデル「Sites」のオーバーライドで問題が発生しました。サイトに「Sites」を含むフォームがあり、Site.domain ではなく Sites の名前を表示する必要があります。モデルをオーバーライドし、それを「Meta」クラスの同じ DB テーブルにルーティングし、エラーが発生します。理解して、ここにコードを書いてください:

モデル:

@python_2_unicode_compatible
class Site(models.Model):

domain = models.CharField(_('domain name'), max_length=100)
name = models.CharField(_('display name'), max_length=50)
objects = SiteManager()

class Meta:
    db_table = 'django_site'
    verbose_name = _('site')
    verbose_name_plural = _('sites')
    ordering = ('domain',)

def __str__(self):
    return self.domain

def save(self, *args, **kwargs):
    super(Site, self).save(*args, **kwargs)
    # Cached information will likely be incorrect now.
    if self.id in SITE_CACHE:
        del SITE_CACHE[self.id]

def delete(self):
    pk = self.pk
    super(Site, self).delete()
    try:
        del SITE_CACHE[pk]
    except KeyError:
        pass

私のオーバーライドされたモデル:

from django.contrib.sites.models import Site
from django.utils.translation import ugettext_lazy as _


class NamedSite(Site):
    def __str__(self):
        return self.name

class Meta:
    db_table = 'django_site'
    verbose_name = _('site')
    verbose_name_plural = _('sites')
    ordering = ('domain',)

とエラー

DatabaseError at <my url>

ERROR:  Column django_site.site_ptr_id doesn't exist
LINE 1: ...ROM "django_site" INNER JOIN "django_site" T2 ON ("django_si...
4

1 に答える 1

1

モデルのサブクラス化は、モデル継承の一例です。「モデルをオーバーライドして同じ db テーブルにルーティングする」ことはできません。

より良いアプローチは、 をサブクラス化し、必要に応じてサイト インスタンスを表示するようにModelChoiceFieldオーバーライドすることです。label_from_instance次に、モデル選択フィールドを使用して、フォーム内のサイトを選択します。

于 2013-09-13T20:08:18.700 に答える