Пользовательские текстовые поля в Django Admin - PullRequest
1 голос
/ 09 ноября 2010

Django (и база данных) новичок здесь.

Я пытаюсь найти способ разрешить создание n пользовательских текстовых полей для таблицы (назовем это Book), используя интерфейс администратора.Я хотел бы, чтобы пользователь мог определять новые текстовые поля через интерфейс администратора (вместо определения таких полей, как CustomField1, CustomField2 и т. Д., С помощью модели, за которой следует запуск manage.py syncdb).хотел бы создать отдельную таблицу с именем CustomFields.Пользователь администратора django (который не является программистом), мог бы пойти и ввести пользовательские текстовые поля в этой таблице (например, pubdate, isbn, country).Затем, при вводе данных для Книги, они нажимали «+» для каждого настраиваемого поля, в котором они хотели, чтобы они были доступны в раскрывающемся списке, и добавляли сопроводительный текст для настраиваемого поля.Текст, введенный для каждого поля, относится к родительской книге.

Есть предложения?У меня есть ощущение, что есть простое решение, которое я как-то здесь не понимаю.

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

Проблемы, с которыми вы можете столкнуться, связаны с тем, что 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 настраиваемых полей и значений напрямую, с возможностью добавить больше, если они пожелают.

Редактировать: Изменен ответ, чтобы отразить дополнительную информацию в комментариях.

0 голосов
/ 09 ноября 2010

Для начала вы можете создать одну модель для книги и одну для текстового поля, оба связаны через отношение внешний ключ . Вы можете легко управлять этим через встроенных администраторов django 1004 *, что позволит вам добавить больше текстовых полей!

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