使用`raw_id_fields`在admin中选择相关对象

时间:2014-11-18 17:02:18

标签: python django

我有一个模型Item,其外键指向Category

Category管理页面中,我希望能够选择现有的Item个对象并对其进行修改。

class Item(models.Model):
    name = models.CharField(max_length=63)
    category = models.ForeignKey('Category', null=True, related_name="items")

class Category(models.Model):
    name = models.CharField(max_length=63)

我尝试过以这种方式设置管理员,但它只是显示空白内联而没有放大镜,或者选择下拉列表以从现有Item实例中进行选择。

class ItemInline(admin.StackedInline):
    model = Item
    allow_add = True
    raw_id_fields = ('category',)

class CategoryAdmin(admin.ModelAdmin):
    list_display = ['name']
    inlines = [
        ItemInline
    ]
    # also tried putting raw_id_fields = ('items',)  here
    # but it prompts an error saying 'CategoryAdmin.raw_id_fields' refers to field 'items' that is missing from model 'Category'.

1 个答案:

答案 0 :(得分:1)

您似乎误解了链接的工作原理。 Django不提供反向外键选择。在Item管理员处,您可以选择Category。但不是相反。

一种解决方法是使用添加自定义小部件的项目,例如Django Tags Input,为管理员添加类似标记的输入字段。

在这种情况下,配置看起来像这样:

<强> settings.py

INSTALLED_APPS = (
    # ... your other installed apps
    'tags_input',
)

TAGS_INPUT_MAPPINGS = {
    'your_app.Item': {
        'field': 'name',
    },
}

<强> admin.py

from tags_input import admin as tags_input_admin

class CategoryAdmin(tags_input_admin.TagsInputAdmin):
    list_display = ['name']

<强> urls.py

from django.conf import urls

urlpatterns = patterns('',
    url(r'^tags_input/', include('tags_input.urls', namespace='tags_input')),
    # ... other urls ...
)

PS:要轻松创建功能齐全的Django admin配置,请尝试Django Admin Generator包。

免责声明:链接的项目是我写的。