Django Admin中的用户定义文本字段

1 投票
2 回答
1645 浏览
提问于 2025-04-16 06:45

我刚接触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 个自定义字段和对应的值,如果他们愿意,还可以选择添加更多。

编辑:根据评论中的进一步信息修改了答案。

撰写回答