2011-07-19 54 views
1

我自动生成字段,所以我想隐藏它从用户。我试过editable = False并将其从中排除。exclude =('field',)。所有这些东西都将这个字段从我这里隐藏起来,但是使它成为空的,所以我得到了错误:“date”列中的空值违反了非空约束如何在Django Admin中隐藏模型字段?

models.py:
类消息(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

如果您动态生成该字段,则向模型admin添加exclude =('field',)应该没问题。你只需要确定你确实在设定价值。 如果您更多地了解您的模型是什么样子以及您正在做什么,它会让我们更好地帮助您。 – Aaron

+0

我试图添加排除,但失败并出现错误。 – Dracontis

回答

2

基于模型的设置,我觉得最简单的事情会将您的日期字段更改为:

date = models.DateTimeField(auto_now=True) 

应该完成您在nd甚至不需要将其从管理中排除,它在默认情况下被排除。如果你有auto_now=True它将作为'最后更新时间'。如果您有auto_now_add=True它将作为创建时间戳。

如果您的用例比简单的自动日期字段更复杂,那么您可以通过其他几种方法来实现您的目标。

覆盖模型的保存方法把价值英寸


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因为工作只传送表单字段回模型实例是否包含字段。我认为这可能是模型形式不会试图给模型分配任意属性。完成此操作的正确方法是在表单的保存方法中设置实例的值。


class MessageAdminForm(forms.ModelForm): 

    def save(*args, **kwargs): 
     self.instance.date = datetime.now() 
     return super(MessageAdminForm, self).save(*args, **kwargs) 
相关问题