django admin中的用户定义文本字段

时间:2010-11-08 21:55:07

标签: python database django database-design relational-database

Django(和数据库)新手在这里。

我正在尝试找到一种方法,使用管理界面为表创建n个自定义文本字段(让我们称之为Book)。我希望用户能够通过管理界面定义新的文本字段(而不是通过模型定义像CustomField1,CustomField2等字段,然后运行manage.py syncdb)。

最终,我想创建一个名为CustomFields的单独表。 django管理员用户(不是程序员)将进入并输入此表中的自定义文本字段(例如pubdate,isbn,country)。然后,在为Book进行数据输入时,他们会为他们想要的每个自定义字段点击“+”,在下拉列表中显示它们,并为自定义字段添加附带的文本。为每个字段输入的文本特定于父书。

有什么建议吗?我觉得有一个简单的解决方案,我在某种程度上不会在这里抓住。

2 个答案:

答案 0 :(得分:2)

您可能遇到问题的地方是因为Django不会根据更改的模型声明重新创建表或列。这意味着您无法在运行时向表中添加字段,而无需手动在数据库上运行生成的sql。相反,您需要的是一种定义自定义字段并将它们链接到模型的方法。

我建议如下:

class CustomField(models.Model):
    name = models.CharField(max_length=32)

class Book(models.Model):
    ... fields

class CustomValue(models.Model):
    field = models.ForeignKey(CustomField)
    value = models.CharField(max_length=255)
    book = models.ForeignKey(Book)

上述验证相当不存在,并且这不允许您为每个模型定义所需的自定义字段,但如果以后需要,您应该能够提出该部分。

# taken and modified from django online tutorial
class CustomValueInline(admin.StackedInline):
    model = CustomValue
    extra = 3

class BookAdmin(admin.ModelAdmin):
    fieldsets = [
       # your fields in here
    ]
    inlines = [CustomValueInline]

admin.site.register(Book, BookAdmin)

这将允许用户直接选择最多3个自定义字段和值,并可选择在需要时添加更多。

编辑:更改了答案以反映评论中的更多信息。

答案 1 :(得分:0)

首先,您可以为书籍创建一个模型,为文本字段创建一个模型,这两个模型都通过foreign key relation连接。您可以通过django's inline admins轻松管理此功能,这样您就可以添加更多文字字段了!

# models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)

class TextField(models.Model):
    text = models.TextField
    book = models.ForeignKey(Book)

# admin.py
from django.contrib import admin
from models import TextField, Book

class TextAdmin(admin.TabularInline):

    model = TextField

class BookAdmin(admin.ModelAdmin):
    inlines = [TextAdmin]

admin.site.register(Book, BookAdmin)