Страницы

Поиск по вопросам

суббота, 7 декабря 2019 г.

Предварительно выбранный автор в админке Django

#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()

Комментариев нет:

Отправить комментарий