Как автоматически вставить текущего пользователя при создании объекта в админке django? - PullRequest
24 голосов
/ 07 июня 2010

У меня есть база статей с

submitter = models.ForeignKey(User, editable=False)

Где User импортируется следующим образом:

from django.contrib.auth.models import User. 

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

У кого-нибудь есть предложения?

Ответы [ 4 ]

38 голосов
/ 07 июня 2010

На всякий случай, если кто-то ищет ответ, вот решение, которое я нашел здесь: http://demongin.org/blog/806/

Подведем итог: У него была таблица эссе следующим образом:

from django.contrib.auth.models import User

class Essay(models.Model):
    title = models.CharField(max_length=666)
    body = models.TextField()
    author = models.ForeignKey(User, null=True, blank=True)

где многопользователь может создавать эссе, поэтому он создал класс admin.ModelAdmin следующим образом:

from myapplication.essay.models import Essay
from django.contrib import admin

class EssayAdmin(admin.ModelAdmin):
    list_display = ('title', 'author')
    fieldsets = [
        (None, { 'fields': [('title','body')] } ),
    ]

    def save_model(self, request, obj, form, change):
        if getattr(obj, 'author', None) is None:
            obj.author = request.user
        obj.save()
2 голосов
/ 27 февраля 2018

Предположим, что пользователь B сохраняет запись, созданную пользователем A. При использовании этого подхода выше запись будет сохранена вместе с пользователем B. В некоторых случаях это может быть не лучшим выбором, поскольку каждый пользователь, который сохраняет эту запись, будет «воровать» это. Существует обходной путь, который спасет пользователя только один раз (тот, кто его создал):

models.py

from django.contrib.auth.models import User

class Car(models.Model):
    created_by = models.ForeignKey(User,editable=False,null=True,blank=True)
    car_name = models.CharField(max_length=40)

admin.py

from . models import *

class CarAdmin(admin.ModelAdmin):
    list_display = ('car_name','created_by')
    actions = None

    def save_model(self, request, obj, form, change):
        if not obj.created_by:
            obj.created_by = request.user
        obj.save()
2 голосов
/ 05 июля 2010

Если вы не хотите сохранять чужую клавишу в своей модели для пользователя, то в вашем admin.py переопределенном методе сохранения

obj.author = request.user.username
obj.save()

Это будет хранить имя пользователя, который вошел в вашу базу данных.

0 голосов
/ 07 июня 2010

Согласно http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.prepopulated_fields нельзя использовать ForeignKey с директивой администратора prepopulated_field, увы

Но эта тема может вам помочь. В своем ответе я также ссылаюсь на отсканированную Google версию Pro Django, в которой есть отличное решение для такого рода вещей. В идеале, я уверен, что лучше купить книгу, но в любом случае у Google, похоже, большая часть соответствующей главы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...