Django(和数据库)新手在这里。
我正在尝试找到一种方法,使用管理界面为表创建n个自定义文本字段(让我们称之为Book)。我希望用户能够通过管理界面定义新的文本字段(而不是通过模型定义像CustomField1,CustomField2等字段,然后运行manage.py syncdb)。
最终,我想创建一个名为CustomFields的单独表。 django管理员用户(不是程序员)将进入并输入此表中的自定义文本字段(例如pubdate,isbn,country)。然后,在为Book进行数据输入时,他们会为他们想要的每个自定义字段点击“+”,在下拉列表中显示它们,并为自定义字段添加附带的文本。为每个字段输入的文本特定于父书。
有什么建议吗?我觉得有一个简单的解决方案,我在某种程度上不会在这里抓住。
答案 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)