2011-07-19 9 views
1

私はフィールドを自動的に生成するので、私はそれをユーザーから隠したいと思っています。試しました編集可能= Falseとそれをexclude =( 'field'、)から非表示にします。これらすべてのものは私からこのフィールドを隠しますが、空にしてエラーが発生しました。カラム "date"のnull値がnullでない制約に違反しています。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

フィールドを動的に生成する場合は、モデル管理者にexclude =( 'field'、)を追加すると問題はありません。実際に値を設定していることを確認するだけです。 あなたのモデルがどのようなものか、あなたがしていることについてもう少し詳しく投稿すると、少し助けてくれます。 – Aaron

+0

除外を追加しようとしましたが、エラーで失敗しました。 – Dracontis

答えて

2

モデルの設定に基づいて、私は考えを行うための最も簡単な事を考えます日付フィールドを

date = models.DateTimeField(auto_now=True) 

に変更してください。管理者から除外する必要はなく、デフォルトでは除外されています。 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) 

のみのモデルに戻ってフォームフィールドを転送あなたがモデルの管理をどうしようとしているかなりのデフォルトジャンゴであるために動作していませんフィールドが含まれている場合はインスタンスです。私はこれがモデル・フォームがモデルに任意の属性を割り当てようとしていないかもしれないと思います。これを行う正しい方法は、フォームのsaveメソッドでインスタンスの値を設定することです。


class MessageAdminForm(forms.ModelForm): 

    def save(*args, **kwargs): 
     self.instance.date = datetime.now() 
     return super(MessageAdminForm, self).save(*args, **kwargs) 
関連する問題