В Django Models, в Admin Area, как автоматически назначить 'запрашивающего' пользователя на одно из полей отношения User с внешним ключом

В следующем режиме в моем проекте я хочу присвоить переменную класса author при создании модели, на стороне пользователя это можно сделать через request.user, но так как класс может быть инстанцирован только из области администратора, это не работает.

class Blog(models.Model):
 title  =  models.CharField(max_length=300)
 content = RichTextField()

 author =  models.ForeignKey(User, related_name="Author", auto_created= True, on_delete= 
 models.CASCADE)
 date =  models.DateTimeField(auto_now_add= True)

Поле auto_created=… [Django-doc] касается наследования модели, оно не добавляет вошедшего пользователя: модельный слой не знает о запросах, и "вошедшего пользователя" как такового не существует. Таким образом, вы переделываете это в:

from django.conf import settings
from django.db import models


class Blog(models.Model):
    title = models.CharField(max_length=300)
    content = RichTextField()
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        related_name='blogs',
        on_delete=models.CASCADE,
        editable=False,
    )
    date = models.DateTimeField(auto_now_add=True)

В админке модели для модели Blog вы можете работать с:

from django.contrib import admin


@admin.register(Blog)
class BlogAdmin(admin.ModelAdmin):
    # …
    def save_model(self, request, obj, form, change):
        obj.author = request.user
        return super().save_model(request, obj, form, change)

Note: The related_name=… parameter [Django-doc] is the name of the relation in reverse, so from the Blog model to the User model in this case. Therefore it (often) makes not much sense to name it the same as the forward relation. You thus might want to consider renaming the Author relation to blogs.


Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.

Вернуться на верх