@zkweb

Как автоматически указать автора записи?

Есть модель:

class Request(models.Model):
    **        
    usercreated = models.ForeignKey(User, blank=True, null=True)


Как мне указать чтобы поле usercreated заполнялось в БД автоматом, после(перед) сохранением записи. ID текущего пользователя. Делал с помощью сигнала, но не вышло, т.к request не может найти.

Проект только в административном интерфейсе, без cbv
  • Вопрос задан
  • 449 просмотров
Решения вопроса 1
@zkweb Автор вопроса
Вот решение, которое помогло мне. Всем спасибо!
def save_formset(self, request, form, formset, change):
        instances = formset.save(commit=False)
        for instance in instances:
            if isinstance(instance, Request):
                if(not instance.usercreated):
                    instance.usercreated = request.user          
                instance.save()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@iegor
Можете поймать юзера в миддлваре и потом достать его от туда при сейве
Ответ написан
zymanch
@zymanch
python/django web-developer
У себя в проектах долгое время делал так:
1. Модель со всеми общими полями для аудита:
models.py
class Audit(models.Model):
    """
    A common class for auditing the models' instances.
    """
    created_by = models.ForeignKey(
        User,
        related_name='%(app_label)s_%(class)s_created_related',
        verbose_name=_(u'Создал'),
        on_delete=models.SET_NULL,
        blank=True, null=True)
    changed_by = models.ForeignKey(
        User,
        related_name='%(app_label)s_%(class)s_changed_related',
        verbose_name=_(u'Изменил'),
        on_delete=models.SET_NULL,
        blank=True, null=True)
    created = models.DateTimeField(
        _(u'Дата создания'), auto_now_add=True)
    changed = models.DateTimeField(
        _(u'Дата изменения'), auto_now=True)
    class Meta:
        abstract = True

2. Для админки:
admin.py
class AuditAdmin(admin.ModelAdmin):
    """
    Admin class for audit fields
    """
    readonly_fields = (
        'created_by',
        'changed_by',
        'created',
        'changed')

    fieldsets_preset = (
        _(u'Прочее'), {
            'fields': (
                'created_by',
                'created',
                'changed_by',
                'changed'
            )
        })
    actions_on_top = True

    def save_model(self, request, obj, form, change):
        if not change:
            obj.created_by = request.user
        obj.changed_by = request.user
        obj.save()


Наследуем все модели и админ-классы, для которых необходимо следить за пользователями, и радуемся.

Это решение перестало меня удовлетворять, как только моделей стало слишком много -- список related отношений для класса User стал просто невыносим. Работаю над переходом к хранению логина пользователя в текстовом виде вместо внешнего ключа на пользователя.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы