DateTimeField yönetici sisteminde gösterilmiyor


89

Yönetici sisteminde "tarih" alanım nasıl görünmüyor?

Admin.py dosyamda

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

ve Derecelendirme modelinde buna benzeyen "tarih" adlı bir alan vardır

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

Ancak yönetici sistemi içinde, alan editableolarak ayarlansa bile gösterilmez True.

Herhangi bir fikri olan var mı?

Yanıtlar:


58

Akılın auto_now_addsahada olduğuna inanıyorum .

Gönderen bu cevap :

Auto_now özniteliği ayarlanmış herhangi bir alan, editable = False'ı da devralacak ve bu nedenle yönetici panelinde görünmeyecektir.

Dokümanlarda da bahsedilmiştir :

Şu anda uygulandığı gibi, auto_now veya auto_now_add öğesinin True olarak ayarlanması, alanın düzenlenebilir = False ve blank = True ayarına sahip olmasına neden olacaktır.

Nesne kaydedildiğinde geçerli tarih saat ile üzerine yazılacaksa alanın düzenlenebilir olması için hiçbir neden olmadığından bu mantıklıdır.


31
Giriş ilk oluşturulduktan sonra kesinlikle auto_now_addyönetici aracılığıyla düzenleme yapabilmeniz gerekir mi?
Christopher Orr

70
Ayrıca sadece mümkün olmalıdır gösterilecek o düzenlenemez olsa bile yönetici arayüzünde.
Brad

1
Yönetici arayüzünde salt okunur bir alan olarak nasıl görüntüleneceğini öğrenmek için lütfen aşağıdaki @hunger yanıtına bakın.
guival

1
Alan yalnızca bir nesne oluşturmada başlatılıyorsa, bir alanın düzenlenebilir olması mantıklıdır (auto_now_add = True).
sergzach

210

Gerçekten yönetici panelinde tarihini görmek istiyorsan, sen ekleyebilir readonly_fieldsiçinde admin.py :

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

admin.site.register(Rating,RatingAdmin)

Belirttiğiniz herhangi bir alan, düzenlenebilir alanlardan sonra en son eklenecektir. Sırayı kontrol etmek için fieldsseçenekleri kullanabilirsiniz .

Ek bilgi Django belgelerinde mevcuttur .


33
Gerçek cevap bu !!
GreenAsJade

4
Eğer bir şart olmadığını fieldsda sen hem de gerekir, böylece bu da alanını koymak zorunda readonly_fieldsve fieldsaksi alan görünmez olur.
Bjorn

Sadece kullanıyorsanız bunun da geçerli olduğunu not etmek istedim fieldsets, bugün bu sorunla karşılaştım.
Kevin Brown

1
Bu, alanın yalnızca belirli bir girişi tıklayıp açtığımızda görünmesini sağlayacaktır. Alanın liste görünümünün kendisinde görünmesini istiyorsanız, stackoverflow.com/a/34966908/4440874
Jyotman Singh

1
Neden olduğundan emin değilim, ancak bu auto_now_add=TrueDjango 1.9 altında DateTimeFields için çalışmıyor gibi görünüyor . Bir (çeşit) geçici çözüm, onları list_displaybunun yerine başlığa eklemektir . Düzenleme: fieldsAlanınızı @BjornTipling'in belirtildiği gibi eklerseniz çalışacaktır.
Taylor Edmiston

23

Büyük Hack:

Bunu gerçekten yapmanız gerekiyorsa (benim yaptığım gibi), alanı aşağıdaki gibi tanımlayarak alanı "düzenlenebilir" olarak ayarlayarak her zaman etrafından dolaşabilirsiniz:

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

Bu, alanı düzenlenebilir hale getirir, böylece onu gerçekten değiştirebilirsiniz. En azından mysql destek motoru ile iyi çalışıyor gibi görünüyor. Diğer destek depolarının bu verileri veritabanında değişmez hale getirip getirmediğini ve bu nedenle düzenleme girişiminde bir soruna neden olup olmayacağını kesin olarak söyleyemem, bu nedenle dikkatli kullanın .


Hayır, bunu yapmayın, Hunger tarafından açıklanan readonly_fields çözümünü kullanın.
GreenAsJade

2
@GreenAsJade: Bir mantık güzel olurdu.
mhsmith

@mhsmith Rationale bunun yerine Hunger's çözümünü kullanmak için: çünkü bu büyük bir hack'tir ve "dikkatli kullanım" ile birlikte gelir, çünkü Hunger'in çözümü, kullanılmak üzere tasarlandığı şekilde django kullanır. İhtiyaç duyduğun şeyi meşru ve destekli bir şekilde yapabiliyorken neden büyük bir hack riskine giresin?
GreenAsJade

6
Bu hack çözümü o kadar da kötü değil. Bununla birlikte, bunun için tek kullanım durumu test etmektir - test cihazının tarihi değiştirmesi gerektiğinde.
jacoor

2
sadece bir uyarı: bu hack benim için geçişleri mahvetti
damio

16

Özel ihtiyaçlarınıza ve davranış farklılığındaki nüanslara bağlı olarak aşağıdakileri yapabilirsiniz:

from django.utils.timezone import now

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

Varsayılan alan şu şekilde kullanılabilir: 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.

Bu, düzenlenebilir olarak ayarlanmıyor False


1
Onun from django.utils.timezone import nowyerine kullanırdım datetime.nowama bu umut verici görünüyor.
amjoconn

Teşekkürler, değiştirdim.
orblivion

Stackoverflow harika çünkü bazı cevaplar doğru soruyu sormadığınızı fark etmenizi sağlıyor! Teşekkür ederim.
Samuel Dauzon

5

Auto_now_add'nin true olmasıyla ilgisi olabilir. Belki de ekleme sırasındaki tarihi yakalamak için bu parametre yerine, kimlik boş olduğunda datetime eklemek için model kaydetme yöntemini geçersiz kılabilirsiniz.

class Rating(models.Model):

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

Eğer olsaydı, o zaman olduğu gibi alanı tanımlamak için hiçbir neden yoktur auto_now
FallenAngel

Neden olumsuz oy kullandığından emin değilim; Shawn Chin'in sağladığı ilk bağlantı benzer bir yaklaşıma işaret ediyor.
Joe J

Bu mantıklı bir alternatif, auto_nowkullanılmadığını varsayarsak ve editable=False. +1
Shawn Chin

3

Herhangi bir alanın tüm girişlerinizin listesinde görünmesini istiyorsanız (yönetici kişilerde bir modeli tıkladığınızda) ve o belirli girişi açtığınızda değil, o zaman -

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

admin.site.register(Rating, RatingAdmin)

'ad', ana alanınız veya yönetici panelinde görüntülemek istediğiniz diğer herhangi bir alandır.

Bu şekilde görmek istediğiniz tüm sütunları belirleyebilirsiniz.


0

Bunu yapamazsın, belgeleri kontrol et

auto_now ve auto_now_add , düzenlenemez alanlardır ve bunları geçersiz kılamazsınız ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.