如何在Django Admin中隐藏模型字段?

时间:2011-07-19 18:28:29

标签: django django-models django-admin

我自动生成字段,所以我想将其隐藏起来。我尝试过 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',)

1 个答案:

答案 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)