#python #django
Имеется вот такая модель: class NewsContent(models.Model): title = models.CharField(_('Title'), max_length=255) author = models.ForeignKey(User, blank=True, null=True, verbose_name = _('Author')) content = models.TextField(_('Content')) Нужно, чтобы в админке django при создании нового новостного контента по умолчанию был выбран текущий пользователь в качестве автора.
Ответы
Ответ 1
Отвечаю на свой вопрос сам. В недрах django нашёл код куда можно внедриться без особых проблем, да и с доступом к request. Получилось очень даже красиво. class NewsContentAdmin(admin.ModelAdmin): def formfield_for_dbfield(self, db_field, **kwargs): field = super(NewsContentAdmin, self).formfield_for_dbfield(db_field, **kwargs) if db_field.name == "author": field.initial = kwargs["request"].user.id return fieldОтвет 2
Создайте кастомную форму для своей модели и переопределите admin view для редактирования данной модели, в этом view словите request.user, который и передадите в форму как initial data (или передадите параметром в конструктор формы). Возможно, для такой мелкой задачи это решение тяжеловато, зато это документированная возможность (не костыль) и при переезде на более новые версии фреймворка у вас ничего "не поедет". Как создать custom admin forms/views для cвоих моделей, подробно описано в официальной документации.Ответ 3
Поскольку ответов нет, могу предложить или сделать все это на js, или сделать так что бы пользователь мог выбрать только себя: если будет вот так author = models.ForeignKey(User, blank=False, null=False, verbose_name = _('Author')) то в admins.py class NewsContentAdmin(admin.ModelAdmin): """Ващ класс для админки для данной модели """ def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == "author": kwargs["queryset"] = Users.objects.filter(pk = request.user.pk) return super(NewsContentAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)Ответ 4
Вот здесь пишут про js решение.Ответ 5
Переопределяем метод save_model класса ModelAdmin и добавляем там пользователя. В вашем случае будет выглядеть примерно так: class NewsContentAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): if not change: obj.author = request.user obj.save()
Комментариев нет:
Отправить комментарий