Wie bearbeite ich Inline -Objekte mit reverse generischer Beziehung im Administratorbereich?
-
27-10-2019 - |
Frage
Ich möchte in der Galerie Inline -Bildobjekte in admin hinzufügen können (wie ich es in admin.py unten probiere). Das Problem ist, dass das Bildmodell kein Content_Type -Feld hat. Es wirft eine Ausnahme auf. Ich möchte dasselbe mit Videosobjekten tun. Hier sind meine Modelle.py und admin.py und mehr Beschreibung unten
Meine Models.py
# -*- coding: utf-8 -*-
# Create your models here.
from apps.util import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from django.utils.translation import ugettext_lazy as _
class Image(models.Model):
"""
"""
title = models.CharField(_('Title'), max_length=255)
image = models.ImageField(upload_to="images")
pub_date = models.DateTimeField(_('Date published'))
def __unicode__(self):
return self.title
class Video(models.Model):
title = models.CharField(_('Title'), max_length=255)
video = models.FileField(upload_to="videos")
pub_date = models.DateTimeField(_('Date published'))
def __unicode__(self):
return self.title
class Gallery(models.Model):
title = models.CharField(_('Title'), max_length=255)
pub_date = models.DateTimeField(_('Date published'))
def __unicode__(self):
return self.title
class GalleryItem(models.Model):
gallery = models.ForeignKey(Gallery)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
def __unicode__(self):
return str(self.object_id)
Mein admin.py
from django.contrib import admin
from apps.webmachinist.media.models import *
from apps.webmachinist.portfolio.models import *
from django.contrib.contenttypes import generic
class GalleryInline(generic.GenericTabularInline):
model = Image
class GalleryAdmin(admin.ModelAdmin):
inlines = [
GalleryInline,
]
admin.site.register(Image)
admin.site.register(Video)
admin.site.register(Gallery, GalleryAdmin)
admin.site.register(GalleryItem)
admin.site.register(PortfolioEntry)
Ich kann es leicht in umgekehrter Weise tun: Galerie zu einem Bild wie folgt hinzuzufügen:
class GalleryInline(generic.GenericTabularInline):
model = GalleryItem
class GalleryAdmin(admin.ModelAdmin):
inlines = [
GalleryInline,
]
admin.site.register(Image, GalleryAdmin)
Dann kann ich nach Galerie -Titel wählen, obwohl Inline für GalerieItems ist, aber es ist nicht das, was ich will. Ich möchte nur Bilder zu Galerien (und späteren Videos) hinzufügen, nicht Galerien zu Bildern.
Kann es leicht gemacht werden?
Lösung
Sie sollten nicht einbinden Image
, sondern eher GalleryItem
. Dann von jedem GalleryItem
Sie können es mit dem generischen Fremdschlüssel mit allem verbinden.