私の(PHP)古いサイトのデータベーステーブルをDjangoにインポートしました。デフォルトでは、モデル内に多数の主キーフィールドが作成されていました(そのほとんどは、id
ではなくnews_id
のようなものだったため)。Djangoの主キーフィールドを変更しました。管理者には表示されません
すべてのプライマリキーの名前をid
に変更し、モデルからフィールドを削除しました。この問題は、私のNewsモデルに特有のものでした。私が追加する新しいものは管理者には表示されません。私は私のModelAdminのから次の行を削除すると、彼らが現れる:
list_display = ['headline_text', 'news_category', 'date_posted', 'is_sticky']
を具体的には、問題が発生しnews_category
フィールドです。そのリストから削除すると、新しいオブジェクトが表示されます。現在、これらのアイテムを直接編集すると(アイテムIDを使用してURLをハッキングする)、それらはデータベース内の同様に有効なカテゴリを持ちます。モデル定義は次のとおりです。
class NewsCategory(models.Model):
def __unicode__(self):
return self.cat_name
#news_category_id = models.IntegerField(primary_key=True, editable=False)
cat_name = models.CharField('Category name', max_length=75)
cat_link = models.SlugField('Category name URL slug', max_length=75, blank=True, help_text='Used in URLs, eg spb.com/news/this-is-the-url-slug/ - generated automatically by default')
class Meta:
db_table = u'news_categories'
ordering = ["cat_name"]
verbose_name_plural = "News categories"
class News(models.Model):
def __unicode__(self):
return self.headline_text
#news_id = models.IntegerField(primary_key=True, editable=False)
news_category = models.ForeignKey('NewsCategory')
writer = models.ForeignKey(Writer) # todo - automate
headline_text = models.CharField(max_length=75)
headline_link = models.SlugField('Headline URL slug', max_length=75, blank=True, help_text='Used in URLs, eg spb.com/news/this-is-the-url-slug/ - generated automatically by default')
body = models.TextField()
extra = models.TextField(blank=True)
date_posted = models.DateTimeField(auto_now_add=True)
is_sticky = models.BooleanField('Is this story featured on the homepage?', blank=True)
tags = TaggableManager(blank=True)
class Meta:
db_table = u'news'
verbose_name_plural = "News"
ここでは、自動生成された主キーフィールドのコメントを確認できます。
Djangoは新しいアイテムにnews_category_idsがないと思っているようですが、間違いなくそうです。私は既存のニュースを編集してカテゴリを変更しようとしましたが、それは正常に機能しました。新しいアイテムの1つを検索すると、それは表示されませんが、検索の最後に「1ニュースが見つかりました」と表示され、何かが進行中です。
喜んで頂いたヒント。
編集:ここに私のModelAdminのは、あまりにもだ:
class NewsCategoryAdmin(admin.ModelAdmin):
prepopulated_fields = {"cat_link": ("cat_name",)}
list_display = ['cat_name', '_cat_count']
def _cat_count(self, obj):
return obj.news_set.count()
_cat_count.short_description = "Number of news stories"
class NewsImageInline(admin.TabularInline):
model = NewsImage
extra = 1
class NewsAdmin(admin.ModelAdmin):
prepopulated_fields = {"headline_link": ("headline_text",)}
list_display = ['headline_text', 'news_category', 'date_posted', 'is_sticky'] #breaking line
list_filter = ['news_category', 'date_posted', 'is_sticky']
search_fields = ['headline_text']
inlines = [NewsImageInline]
モデルを変更した後にデータベースを移行しましたか?テーブルを削除してsyncdbを再実行しようとしました – akonsu
同じ名前の列の名前を変更するために、手動SQLスクリプトを実行しました。 syncdbは正常に実行されます。 –
もデータベースの主キーですか?私はあなたが主キーに何が起こったのフィールドの名前を変更したという意味ですか? – akonsu