管理员内联模型没有直接关系或外键

时间:2017-01-19 11:46:54

标签: python django django-models django-admin

所以,我有这个模型:

class Media(models.Model):
    title = models.CharField(max_length=50, blank=True)
    slug = models.SlugField(max_length=70, blank=True, editable=False)

    class Meta:
        abstract = True

class Photo(Media):
    source = models.ImageField(upload_to='uploads/gallery/photo')

class Video(Media):
    source = models.FileField(upload_to='uploads/gallery/photo')

class Item(models.Model):
    content_type = models.ForeignKey(
        ContentType,
        limit_choices_to={'model__in': ['photo', ]},
        on_delete=models.CASCADE,
    )
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

class Album(Media):
    items = models.ManyToManyField(Item)

我如何将照片和视频的相册管理员设为内嵌,以便在创建相册时上传照片和视频?

当我尝试为照片制作内联并将其挂钩到相册管理员时,我收到错误“照片没有相册的外键”,很明显,从那里我认为应该有一种方法将相册管理所需的外键与内容相关联来自模型项目的对象。

注意:我特别不想要项目管理员。在模型后保存信号中创建项目。

1 个答案:

答案 0 :(得分:0)

我认为这不是开箱即用的。但是你可以使用像django-smart-selects-generics这样的库。根据您的django版本,您可能需要更新一些文件。

安装适用于:

pip install django-smart-selects-generic

您还需要安装django-smart-selects

然后在设置中添加两个应用。

INSTALLED_APPS = (
        ...
        'smart_selects',
        'smart_generic'  
          )

然后在你的admin.py中你可以这样做:

from smart_generic.form_fields import GenericChainedModelChoiceField
from django.forms.models import ModelForm

class TForm(ModelForm):
    object_id = GenericChainedModelChoiceField('content_type','content_type',label=u'Content object',queryset=TargetRelation.objects.all())
    class Meta:
        model = TargetRelation
        fields = ['target','content_type']


class TRAdmin(admin.ModelAdmin):
    form = TForm

class TRInline(admin.TabularInline):
    model = TargetRelation
    form = TForm

class PlanetAdmin(admin.ModelAdmin):
    inlines=[TRInline,]

根据您的django版本,您可能需要在widgets.py中替换:

Media = ChainedSelect.Media 

通过

.media = ChainedSelect.Media 

在smart_select views.py中添加:

import json as simplejson

并将return语句替换为:

return HttpResponse(json, content_type='application/json')