FieldError: 'created' 无法为Post模型表单指定,因为它是一个不可编辑的字段。

9 浏览
0 Comments

FieldError: 'created' 无法为Post模型表单指定,因为它是一个不可编辑的字段。

Django 3.0.8中文翻译如下:

admin.py

class PostAdmin(admin.ModelAdmin):
    list_display = ("id", "title", 'category',)
    def get_fields(self, request, obj=None):
        fields = [a_field.name for a_field in self.model._meta.fields]
        return fields
    def get_readonly_fields(self, request, obj):
        readonly_fields = self.readonly_fields
        if obj:
            if obj.already_published and (not request.user.has_perm('posts.change_already_puclished')):
                readonly_fields = READONLY_FIELDS_AFTER_PUBLISHING
        return readonly_fields

traceback

异常类型:FieldError
异常值:Post模型表单不能指定'created',因为它是一个不可编辑的字段。请检查PostAdmin类的fields/fieldsets/exclude属性。

Local vars

变量    值
change  
False
defaults    
{'exclude': None,
 'fields': ['id',
            'comment',
            'title',
            'slug',
            'description',
            'body',
            'draft',
            'already_published',
            'featured_image',
            'category',
            'excerpt',
            'h1',
            'author',
            'created',
            'updated',
            'sidebar',
            'keywords',
            'lsi',
            'google_indexed',
            'google_first_indexed',
            'yandex_indexed',
            'yandex_first_indexed'],
 'form': ,
 'formfield_callback': functools.partial(>, request=)}
exclude 
None
excluded    
None
fields  
['id',
 'comment',
 'title',
 'slug',
 'description',
 'body',
 'draft',
 'already_published',
 'featured_image',
 'category',
 'excerpt',
 'h1',
 'author',
 'created',
 'updated',
 'sidebar',
 'keywords',
 'lsi',
 'google_indexed',
 'google_first_indexed',
 'yandex_indexed',
 'yandex_first_indexed']
form    

kwargs  
{}
new_attrs   
{'declared_fields': {}}
obj 
None
readonly_fields 
()
request 

self    

与图片相同:

enter image description here

我尝试使用超级用户和没有change_already_puclished权限的用户运行此代码。

  1. 超级用户:尝试添加或更改文章时,出现错误。
  2. 普通用户:添加文章没有问题,没有错误。但添加新文章会导致此错误。

Edit

class Post(DraftMixin,
       TitleMixin,
       TagMixin,
       SlugMixin,
       DescriptionMixin,
       CommentMixin,
       FeaturedImageMixin,
       BodyMixin,
       models.Model):
category = models.ForeignKey(Category,
                             on_delete=models.PROTECT,
                             verbose_name="分类")
excerpt = models.TextField(default=True,
                           blank=True,
                           verbose_name="摘要") # 与文章相关的文本。大多数情况下,用作文章摘要。
h1 = models.CharField(max_length=500,
                      blank=True,
                      default="",
                      verbose_name="H1")
author = models.ForeignKey(Author,
                           blank=True,
                           null=True,
                           on_delete=models.PROTECT,
                           related_name='blog_posts',
                           verbose_name="作者")
created = models.DateField(auto_now_add=True,
                           verbose_name="创建日期")
updated = models.DateField(auto_now=True,
                           verbose_name="更新日期")
sidebar = models.ForeignKey(Sidebar,
                            null=True,
                            blank=True,
                            on_delete=models.PROTECT,
                            verbose_name="侧边栏")
keywords = models.TextField(blank=True, default="", verbose_name="关键词")
lsi = models.TextField(blank=True, default="", verbose_name="LSI")
google_indexed = models.BooleanField(verbose_name="谷歌索引",
                                     default=False)
google_first_indexed = models.DateField(blank=True,
                                        null=True,
                                        verbose_name="谷歌首次索引日期")
yandex_indexed = models.BooleanField(verbose_name="Yandex索引",
                                     default=False)
yandex_first_indexed = models.DateField(blank=True,
                                        null=True,
                                        verbose_name="Yandex首次索引日期")
class Meta:
    ordering = ('-created',)
    verbose_name = "文章"
    verbose_name_plural = "文章"
    permissions = [
        ("change_already_puclished", '可以更改"已发布"状态'),
    ]

0
0 Comments

问题原因:在Post模型表单中,'created'字段被设置为不可编辑的字段(editable=False),同时使用了auto_now_add=True属性,这导致了该错误的出现。

解决方法:有两种解决方法。一种是移除auto_now_add和auto_now属性,并手动提供相应的值。另一种是让Django自动处理这些字段。

具体参考Django文档:DateField.auto_now_add

0
0 Comments

问题的原因是在Post模型的定义中,created字段被设置为auto_now_add=True,这意味着Django无法编辑它。因此,无法将其指定为可编辑的表单字段。

解决方法是将其指定为只读字段。可以参考以下链接中的方法:Django admin: How to display a field that is marked as editable=False' in the model?

文章整理如下:

问题出现在Post模型的定义中,其中created字段被设置为auto_now_add=True,这导致Django无法编辑它。因此,无法将其指定为可编辑的表单字段。

解决这个问题的方法是将其指定为只读字段。可以参考以下链接中的方法:Django admin: How to display a field that is marked as editable=False' in the model?

0