Django Admin中的用户定义文本字段
我刚接触Django和数据库。
我想找个办法,让用户在管理界面上为一个表(我们叫它“书籍”)创建多个自定义文本字段。我希望用户能通过管理界面定义新的文本字段,而不是像CustomField1、CustomField2这样通过模型定义字段,然后再运行manage.py syncdb。
最终,我想创建一个叫做CustomFields的单独表。Django的管理用户(不是程序员)可以在这个表里输入自定义文本字段(比如出版日期、ISBN、国家)。然后,在为一本书输入数据时,他们可以点击“+”来添加每个想要的自定义字段,这些字段会在下拉菜单中显示,并且可以为每个自定义字段添加相应的文本。每个字段输入的文本都是特定于这本书的。
有什么建议吗?我觉得这里应该有个简单的解决办法,但我似乎没能理解。
2 个回答
0
一开始,你可以为书本创建一个模型,为文本字段再创建一个模型,这两个模型通过一个叫做外键关系连接起来。这样的话,你就可以通过Django的内联管理界面轻松管理它们,这样你就能添加更多的文本字段了!
# 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)
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 个自定义字段和对应的值,如果他们愿意,还可以选择添加更多。
编辑:根据评论中的进一步信息修改了答案。