Изменить / показать первичный ключ в Django Admin - PullRequest
32 голосов
/ 28 марта 2010

Похоже, Django скрывает поля, помеченные первичным ключом, как отображаемые / редактируемые в интерфейсе администратора Django.

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

Ответы [ 6 ]

34 голосов
/ 01 июля 2012

Я также хотел просто показать «id» (первичный ключ) в админке Django, но не обязательно редактировать его. Я просто добавил его в список readonly_fields, и он обнаружился нормально. IE:

class StudentEnrollmentInline(admin.TabularInline):
    model = Enrollment
    readonly_fields=('id',)

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

12 голосов
/ 29 марта 2010

Если вы явно укажете поле первичного ключа в своих моделях (с помощью primary_key=True), вы сможете редактировать его в администраторе.

Для моделей Django, созданных с помощью ./manage.py syncdb, автоматически добавляется следующее поле первичного ключа:

id = models.AutoField(primary_key=True)

если вы измените (или добавите) это в свою модель явно как первичный ключ IntegerField, вы сможете редактировать его напрямую с помощью администратора:

id = models.IntegerField(primary_key=True)

Но, как отмечали другие, это потенциальное минное поле ...

1 голос
/ 16 января 2019

Чтобы показать первичный ключ, который по умолчанию будет иметь имя столбца «id» в базе данных - используйте «pk»

def __str__(self):
    return '{} - {} ({})'.format(self.pk, self.name, self.pcode)
1 голос
/ 27 марта 2018

Ответ с наибольшим количеством голосов не сработал для меня. Мне нужен добытчик.

class StudentEnrollmentInline(admin.TabularInline):
    model = Enrollment
    readonly_fields=('student_enrollment_id',)

    def student_enrollment_id(self, obj):
        return obj.id

Использование django 1.11

1 голос
/ 11 октября 2012

В документации django есть короткое предложение о том, что не ясно:

Если нет ни полей, ни параметров наборов полей, Django по умолчанию будет отображать каждое поле, которое не является автоматическим полем и имеет editable = True, в одном наборе полей, в том же порядке, в котором поля определены в модели.

Причина в том, что django не позволяет вам редактировать AutoField каким-либо образом (и это правильно, так как это значение с автоматическим приращением и не должно редактироваться). Ответ @ mnelson4 - хороший подход к его отображению.

1 голос
/ 28 марта 2010

Не имеет смысла иметь дополнительный первичный ключ. Либо PK является автоинкрементом, и в этом случае нет необходимости редактировать его, либо он указывается вручную, и в этом случае он всегда требуется.

Зачем вам это нужно?

...