Как скрыть поле модели в Django Admin? - PullRequest
1 голос
/ 19 июля 2011

Я генерирую поле автоматически, поэтому хочу скрыть его от пользователя.Я попытался editable = False и скрыл его от exclude = ('field',) .Все это скрывает это поле от меня, но сделало его пустым, поэтому я получил ошибку: нулевое значение в столбце "дата" нарушает ограничение не-ноль

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 Ответ

2 голосов
/ 20 июля 2011

Исходя из настроек вашей модели, я думаю, что проще всего было бы изменить поле даты на:

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)

То, что вы пытаетесь сделать с Администратором модели, не совсем работает, потому что по умолчанию django только передает поля формы обратно в экземпляр моделиесли поля включены.Я думаю, что это может быть так, что форма модели не пытается присвоить модели произвольные атрибуты.Правильный способ сделать это - установить значение экземпляра в методе сохранения вашей формы.


class MessageAdminForm(forms.ModelForm):

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