Редактировать/показать первичный ключ в Django Admin
Похоже, что Django скрывает поля, которые помечены Первичным ключом, отображаться/редактироваться в интерфейсе администратора Django.
Скажем, я хотел бы ввести данные, в которых я могу или не хочу указывать первичный ключ. Как мне перейти к отображению первичных ключей в интерфейсе администратора и как я могу указать, что это необязательно?
Ответы
Ответ 1
Я также хотел просто показать "id" (первичный ключ) в администраторе Django, но не обязательно его редактировать. Я просто добавил его в список readonly_fields
, и он показал, что это хорошо. IE:
class StudentEnrollmentInline(admin.TabularInline):
model = Enrollment
readonly_fields=('id',)
тогда как если бы я попытался добавить его в список "fields", Django расстроился со мной, сказав, что этого поля не существует...
Ответ 2
Если вы явно указываете поле первичного ключа в своих моделях (с primary_key=True
), вы должны иметь возможность редактировать его в admin.
Для моделей Django, созданных с помощью ./manage.py syncdb
, автоматически добавляется следующее поле первичного ключа:
id = models.AutoField(primary_key=True)
если вы измените (или добавите) это в свою модель явно как первичный ключ IntegerField, вы сможете отредактировать его непосредственно с помощью admin:
id = models.IntegerField(primary_key=True)
Но, как указывали другие, это потенциальное минное поле...
Ответ 3
Нет смысла иметь дополнительный первичный ключ. Либо PK - это автоинкремент, и в этом случае нет необходимости его редактировать или вручную указывать, и в этом случае это всегда необходимо.
Зачем вам это нужно?
Ответ 4
В документации django, есть короткое предложение об этом, что неясно:
Если не указаны ни поля, ни параметры полей, Django по умолчанию будет отображать каждое поле, которое не является автофитомлом, и имеет editable = True в одном наборе полей в том же порядке, что и поля, определенные в модели.
Причина в том, что django не позволяет вам редактировать AutoField
любыми способами (и это правильно, поскольку это значение автоматического увеличения и не должно редактироваться). Ответ @mnelson4 - хороший подход для его отображения.
Ответ 5
Ответ с наибольшим количеством голосов не работал для меня. Мне нужен добытчик.
class StudentEnrollmentInline(admin.TabularInline):
model = Enrollment
readonly_fields=('student_enrollment_id',)
def student_enrollment_id(self, obj):
return obj.id
Используя django 1.11
Ответ 6
Чтобы показать первичный ключ, который по умолчанию будет иметь имя столбца "id" в базе данных - используйте "pk"
def __str__(self):
return '{} - {} ({})'.format(self.pk, self.name, self.pcode)