DateTimeField가 관리 시스템에 표시되지 않습니다.


87

내 "날짜"필드가 관리 시스템에 나타나지 않는 이유는 무엇입니까?

내 admin.py 파일에는

from django.contrib import admin
from glasses.players.models import *
admin.site.register(Rating)

등급 모델에는 다음과 같은 "날짜"라는 필드가 있습니다.

date = models.DateTimeField(editable=True, auto_now_add=True)

그러나 관리 시스템 내에서는 editable로 설정되어 있어도 필드가 표시되지 않습니다.True .

누구든지 아이디어가 있습니까?

답변:


55

나는 이성이 auto_now_add현장에 있다고 믿습니다 .

에서 이 대답 :

auto_now 속성이 설정된 모든 필드는 editable = False를 상속하므로 관리자 패널에 표시되지 않습니다.

또한 문서 에서 언급 :

현재 구현 된대로 auto_now 또는 auto_now_add를 True로 설정하면 필드에 editable = False 및 blank = True가 설정됩니다.

개체가 저장 될 때 현재 날짜 / 시간으로 덮어 쓸 경우 필드를 편집 할 수있는 이유가 없기 때문에 이는 의미가 있습니다.


31
항목이 처음 생성 된 auto_now_add 관리자를 통해 편집 할 수 있어야 하나요?
Christopher Orr

68
또한 편집 할 수없는 경우에도 관리자 인터페이스에 간단히 표시 할 수 있어야합니다 .
Brad

1
관리자 인터페이스에서 읽기 전용 필드로 표시하는 방법은 아래 @hunger의 답변을 참조하십시오.
guival

1
필드가 객체 생성시에만 초기화 된 경우 (auto_now_add = True) 필드를 편집 할 수 있도록하는 것이 좋습니다.
sergzach

206

관리자 패널에서 날짜를보고 싶다면 admin.py를 추가하면 readonly_fields됩니다 .

class RatingAdmin(admin.ModelAdmin):
    readonly_fields = ('date',)

admin.site.register(Rating,RatingAdmin)

지정하는 모든 필드는 편집 가능한 필드 뒤에 마지막으로 추가됩니다. 순서를 제어하려면 다음을 사용할 수 있습니다.fields 옵션을 있습니다.

추가 정보는 Django 문서 에서 사용할 수 있습니다 .


33
이것이 진짜 답입니다 !!
GreenAsJade 2014 년

4
만약 당신이 a를 규정한다면 당신은 fields또한 당신의 필드를 거기에 넣어야합니다. 그래서 당신은 그것이 필요 readonly_fields하고 fields그렇지 않으면 필드가 나타나지 않을 것입니다.
Bjorn

을 사용하는 경우에도 적용된다는 점을 알고 싶었 fieldsets습니다. 오늘이 문제가 발생했습니다.
Kevin Brown

1
이렇게하면 특정 항목을 클릭하고 열 때만 필드가 나타납니다. 필드가 목록보기 자체에 표시되도록하려면 stackoverflow.com/a/34966908/4440874
Jyotman Singh

1
이유는 확실하지 않지만 auto_now_add=TrueDjango 1.9 에서 DateTimeFields에서 작동하지 않는 것 같습니다 . (일종의) 해결 방법은 list_display대신 튜플 에 추가하는 것입니다. 편집 : fields@BjornTipling이 언급 한대로 필드를 추가하면 작동합니다 .
테일러 Edmiston

23

주요 해킹 :

이 작업을 정말로 수행해야하는 경우 (내가하는 것처럼) 다음과 같이 필드를 "편집 가능"하도록 필드를 즉시 설정하여 언제든지 해킹 할 수 있습니다.

class Point(models.Model):
  mystamp=models.DateTimeField("When Created",auto_now_add=True)
  mystamp.editable=True

이렇게하면 필드를 편집 할 수 있으므로 실제로 변경할 수 있습니다. 적어도 mysql 백업 엔진에서는 잘 작동하는 것 같습니다. 다른 백업 저장소가이 데이터를 데이터베이스에서 변경 불가능하게 만들어 편집을 시도 할 때 문제를 일으키는 경우 certian에 대해 말할 수 없으므로 주의해서 사용하십시오 .


아니, 이러지 말고 Hunger가 설명하는 readonly_fields 솔루션을 사용하십시오.
GreenAsJade 2014 년

2
@GreenAsJade : 근거가 좋을 것입니다.
mhsmith 2015

@mhsmith이 대신 Hunger의 솔루션을 사용하는 이유 : 이것은 주요 해킹이고 "주의해서 사용"이 함께 제공되기 때문에 Hunger의 솔루션은 사용하도록 설계된 방식으로 django를 사용합니다. 합법적이고 지원되는 방식으로 필요한 작업을 수행 할 수 있는데 왜 주요 해킹 위험을 감수할까요?
GreenAsJade 2015

6
이 해킹 솔루션은 그렇게 나쁘지 않습니다. 그러나 내가 보는 유일한 사용 사례는 테스터가 날짜를 변경해야 할 때 테스트입니다.
jacoor 2015

2
단지 경고 :이 해킹 나를 위해 마이그레이션을 엉망
damio

16

특정 요구 사항 및 동작 차이의 뉘앙스에 따라 다음을 수행 할 수 있습니다.

from django.utils.timezone import now

class MyModel(models.Model):
    date = models.DateTimeField(default=now)

기본 필드는 다음과 같이 사용할 수 있습니다. https://docs.djangoproject.com/en/dev/ref/models/fields/#default

The default value for the field. This can be a value or a callable object. If callable it will be called every time a new object is created.

편집 가능으로 설정되지 않습니다. False


1
from django.utils.timezone import now대신을 사용 datetime.now하지만 이것은 유망 해 보입니다.
amjoconn

감사합니다. 변경했습니다.
orblivion

Stackoverflow는 굉장합니다. 일부 답변은 올바른 질문을하지 않았다는 것을 깨닫게하기 때문입니다! 감사합니다.
Samuel Dauzon 19 년

5

auto_now_add가 true 인 것과 관련이있을 수 있습니다. 추가시 날짜를 캡처하는 매개 변수 대신 모델 저장 메소드를 재정 의하여 ID가 ​​null 일 때 datetime을 삽입 할 수 있습니다.

class Rating(models.Model):

    ....
    def save(self, *args, **kwargs)
        if not self.id: 
            self.date = datetime.datetime.now()

당신이 한 경우, 다음과 같이 필드를 정의 할 이유가 없다 auto_now
FallenAngel

왜 반대표를 던 졌는지 확실하지 않습니다. Shawn Chin이 제공하는 첫 번째 링크는 유사한 접근 방식을 나타냅니다.
Joe J

auto_now사용되지 않는다고 가정 하고 editable=False. +1
Shawn Chin

3

특정 항목을 열 때가 아니라 모든 항목 목록 (관리자에서 모델을 클릭 할 때)에 필드를 표시하려면-

class RatingAdmin(admin.ModelAdmin):
    list_display = ('name', 'date') 

admin.site.register(Rating, RatingAdmin)

'이름'은 기본 필드 또는 관리자 패널에 표시하려는 기타 필드입니다.

이 방법으로보고자하는 모든 열을 지정할 수 있습니다.


0

그렇게 할 수 없습니다. 문서를 확인하십시오.

auto_nowauto_now_add 는 모두 편집 할 수없는 필드이며 재정의 할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.