在Django中,“DateTimeField()”不可编辑。

7
我有一个博客,发布了很多文章。每篇文章都有一个发布日期,有时我需要编辑这个日期。一切都在Django管理面板上运行,自从我决定在admin.py中添加DateTimeField以来,我从未遇到过任何500错误。
问题是,Django无法编辑DateTimeField并返回以下内容:

Internal Server Error: /admin/wall/articles/62/change/

FieldError at /admin/wall/articles/62/change/ 'date' cannot be specified for Articles model form as it is a non-editable field. Check fields/fieldsets/exclude attributes of class ArticlesAdmin.

我不明白为什么它不起作用。

models.py:

class Articles(models.Model):
    title = models.CharField(max_length=100, null=False, verbose_name="Titre")
    description = models.TextField(max_length=500, null=False, verbose_name="Description pour les partages sur les réseaux sociaux")
    subtitle = models.TextField(max_length=300, null=True, verbose_name="Sous-titre")
    text = RichTextUploadingField()
    tag = models.ManyToManyField(Tag, verbose_name="Tag")
    subcategory = models.ForeignKey(SubCategory, verbose_name="Sous-catégorie", blank=True, null=True)
    image = models.FileField(upload_to='media/articles/', validators=[validate_file_extension], blank=True, null=True, verbose_name="Image de présentation")
    image_description = models.CharField(max_length=100, null=True, verbose_name="Description pour cette image")
    image_legende = models.CharField(max_length=100, null=True, verbose_name="Légende pour cette images")
    author = models.ForeignKey(User, verbose_name="Auteur")
    published = models.BooleanField(default=True, verbose_name="Publié")
    date = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name="Date de création")
    update = models.DateTimeField(auto_now=True, verbose_name="Dernière modification")
    

    def get_absolute_url(self):
        return reverse('read', kwargs={'post':self.id, 'slug':slugify(self.title)})
    
    def __str__(self):
        return self.title

admin.py:

class ArticlesAdmin(admin.ModelAdmin):
    list_display = ('date', 'title', 'author', 'published', 'update')

    fieldsets = (
        ('Général', {
            'fields': ('title', 'author', 'published', 'tag')
            }),
        ('Date de publication', {
            'fields': ('date',)}),
        ('Choisir une image de présentation (700px de largeure et 320px de hauteur', {
            'fields': ('image',)}),
        ('Description de l\'image', {
            'fields': ('image_description',)}),
        ('Légende de l\'image', {
            'fields': ('image_legende',)}),
        ('Sous-titre de l\'article', {
            'fields': ('subtitle',)}),                  
        ('Contenu de l\'article', {
            'fields': ('text', 'description')}),
    )
        
admin.site.register(Articles, ArticlesAdmin)

如果auto_now_add=True,则无法更新日期字段。 - Vaibhav
可能与 auto_add_now = True 的事实有关。 - Matthew Manning
2个回答

17

auto_now_add=True 会使该字段变为不可编辑状态。你应该禁用 auto_now_add (auto_now_add=False) 并自己实现该行为(例如,在文章的save()方法中添加 self.date = timezone.now())。

关于命名的小备注:你应该使用单数形式来命名模型,而不是复数形式(Article 而不是 Articles)。


是的,我注意到我的命名有错误了 :) - GrandGTO
1
我移除了"auto_now_add"字段,并用以下代码替换它:"date = models.DateTimeField(verbose_name="Date de création", default=timezone.now(), null=False)"。谢谢。 - GrandGTO
3
请使用default=timezone.now代替default=timezone.now()。 - Ricardo D. Quiroga
对于那些不清楚“import”的含义的人来说:from django.utils import timezone。 - Private
如果有人只是需要测试和编辑创建日期以进行测试,那么Django在测试方面不够灵活吗? - Vedmant
显示剩余2条评论

0

auto_now=Trueauto_now_add=True 会使得 DateTimeField()DateField()TimeField()editable=False

文档中在 DateField.auto_now_add 中说道:

目前实现的方式是,将 auto_nowauto_now_add 设置为 True 将导致该字段具有 editable=Falseblank=True

即使您像下面所示那样使用auto_now=Trueauto_now_add=Trueeditable=True设置为它们,它们实际上是editable=False

datetime = models.DateTimeField(auto_now=True, editable=True)
date = models.DateField(auto_now=True, editable=True)
time = models.TimeField(auto_now_add=True, editable=True)

所以要使它们变成 editable=True,只需从中删除 auto_now=Trueauto_now_add=True,如下所示:

datetime = models.DateTimeField()
date = models.DateField()
time = models.TimeField()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接