[Answered ]-User-defined text fields in django admin

2👍

Where you might run into problems is because Django will not recreate tables or columns based on changing model declarations. This means you’re unable to add fields to a table at run-time without running the generated sql on your database manually. What you’ll need, instead, is a way of defining custom fields, and linking them to your model.

What I’d suggest is the following:

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)

The validation on the above is fairly non-existant, and this doesn’t allow you to define required custom fields for each model, but you should be able to come up with that part if you need it later on.

# 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)

This will allow users to select up to 3 custom fields and values directly, with the option to add more if they wish.

Edit: Changed the answer to reflect further information in comments.

0👍

For the beginning you can create one model for the book and one for the text field, both connected through a foreign key relation. You can easily administrate this then through django’s inline admins, which will enable you to add more text fields!

# 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)

Leave a comment