#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
И скриншот строки с недавно добавленной строкой:
Извините, я пока не могу вставить
Как вы можете видеть, я не могу добавить новые метаданные в родительскую запись, потому что новая строка становится пустой и непригодной для использования.
Вывод
Как я понимаю, на самом деле это две проблемы:
- Как я могу сделать встроенную визуализацию различных полей для недавно добавленной строки?
- Как я могу редактировать связанные данные в встроенном для многих отношений?
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.