Встроенные поля изменения администратора Django в новой строке

#django #django-admin

Вопрос:

Фон

Я настраиваю страницы администратора для системы инвентаризации с множеством множества взаимосвязей и других сложных данных. Я хочу отобразить эти отношения с помощью строк, но мне не нравится раскрывающееся поле по умолчанию, которое Django использует для множества отношений в строке, поэтому я настроил набор полей. Мои пользовательские поля относительно просты, поле идентификатора, которое ссылается на связанную запись, текстовые поля только для чтения с данными из связанной записи, так как встроенный не может получить поля из связанной записи по умолчанию; что — то в этом роде.

Проблема

Проблема в том, что для того, чтобы использовать пользовательские поля в этих строках, мне пришлось сделать их все доступными только для чтения. Обычно это нормально, потому что вы можете перейти по ссылке в поле идентификатора на фактическую страницу редактирования, но добавить новую запись с помощью кнопки на встроенной странице невозможно, потому что я не могу ввести какую-либо необходимую информацию. Мои идентификаторы даже не увеличиваются автоматически, так как эти данные должны синхронизироваться с другой базой данных, поэтому новая строка не ссылается на вновь созданную запись.

В принципе, то, что я хочу сделать, — это иметь другой набор доступных для записи полей во вновь добавленных строках, чтобы можно было заполнить обязательные поля, такие как идентификатор.

Проблемы

Я пытался сделать это, перегружая функции get_fields() и get_readonly_fields (), но, похоже, они определяют поля для всей строки, а не для отдельных строк. Я также даже не уверен, что можно включить поле, доступное для записи, для многих отношений, так как встроенный фактически отображает данные из промежуточной модели, а не саму связанную запись.

Код

Вот пример одной из моих простых строк, чтобы дать вам лучшее представление о том, о чем я говорю:

 class MetaDataInline(admin.TabularInline):
    verbose_name = 'meta data'
    verbose_name_plural = 'meta data'
    model = Product.meta_data.through
    fields = ('key', 'value')
    readonly_fields = ('key', 'value')
    extra = 0

    def key(self, obj): return obj.metadata.key
    def value(self, obj): return obj.metadata.value
 

И скриншот строки с недавно добавленной строкой:

Извините, я пока не могу вставить

Как вы можете видеть, я не могу добавить новые метаданные в родительскую запись, потому что новая строка становится пустой и непригодной для использования.

Вывод

Как я понимаю, на самом деле это две проблемы:

  1. Как я могу сделать встроенную визуализацию различных полей для недавно добавленной строки?
  2. Как я могу редактировать связанные данные в встроенном для многих отношений?

Any help I can get towards answering these 2 questions, or suggestions for an alternative approach would be greatly appreciated. I know that displaying the relationship as a horizontal filter instead of an Inline would give me the functionality I want, but I dislike the way it displays my data so I want to make it work like this if possible.