我自动生成字段,所以我想将其隐藏起来。我尝试过 editable = False 并将其隐藏起来 exclude =('field',)。所有这些都隐藏了这个字段,但是它变空了所以我有错误:列“date”中的空值违反了非空约束。
models.py:
class Message(models.Model):
title = models.CharField(max_length = 100)
text = models.TextField()
date = models.DateTimeField(editable=False)
user = models.ForeignKey(User, null = True, blank = True)
main_category = models.ForeignKey(MainCategory)
sub_category = models.ForeignKey(SubCategory)
groups = models.ManyToManyField(Group)`
admin.py:
class MessageAdminForm(forms.ModelForm):
def __init__(self, *arg, **kwargs):
super(MessageAdminForm, self).__init__(*arg, **kwargs)
self.initial['date'] = datetime.now()
class MessageAdmin(admin.ModelAdmin):
form = MessageAdminForm
list_display = ('title','user',)
list_filter = ('date',)
答案 0 :(得分:2)
根据您的模型设置,我认为最简单的方法是将日期字段更改为:
date = models.DateTimeField(auto_now=True)
应该完成你所追求的目标而你甚至不需要将它从管理员中排除,它默认排除在外。如果您有auto_now=True
,它将作为“上次更新时间”。如果您有auto_now_add=True
,它将作为创建时间戳。
如果您的用例比简单的自动日期字段更复杂,还有其他几种方法可以实现您的目标。
覆盖模型的save方法以将值放入。
class Message(models.Model):
title=models.CharField(max_length=100)
date = models.DateTimeField(editable=False)
def save(*args, **kwargs):
self.date = datetime.datetime.now()
super(Message, self).save(*args, **kwargs)
您尝试使用模型管理员的工作并不常用,因为默认情况下,如果包含字段,django仅将表单字段传回模型实例。我认为这可能是模型形式不会尝试将任意属性分配给模型。完成此操作的正确方法是在表单的save方法中设置实例的值。
class MessageAdminForm(forms.ModelForm):
def save(*args, **kwargs):
self.instance.date = datetime.now()
return super(MessageAdminForm, self).save(*args, **kwargs)