web-dev-qa-db-ja.com

Django adminでオブジェクトを作成するときに、現在のユーザーを自動挿入するにはどうすればよいですか?

私は記事のデータベースを持っています

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

ここで、Userは次のようにインポートされます。

from Django.contrib.auth.models import User. 

特定のユーザーが記事を送信したときに、現在アクティブなユーザーを送信者フィールドに自動挿入したいと思います。

誰か提案がありますか?

26
FurtiveFelon

誰かが答えを探している場合に備えて、ここに私が見つけた解決策があります: 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()
39
FurtiveFelon

モデル内の外部キーをユーザーに保持したくない場合は、admin.pyオーバーライド保存メソッドで

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

これにより、データベースにログインしているユーザー名が保存されます。

2
ha22109

ユーザーBがユーザーAによって作成されたレコードを保存するとします。上記のアプローチを使用すると、レコードはユーザーBとともに保存されます。シナリオによっては、そのレコードを保存する各ユーザーが「盗む」ため、これが最善の選択ではない場合があります。それ。これには回避策があり、ユーザー(作成者)を1回だけ保存します。

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
Lourenzo Costa

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#Django.contrib.admin.ModelAdmin.prepopulated_fields のようにprepopulated_fieldadminディレクティブでForeignKeyを使用することはできません、悲しいかな

しかし このスレッド はあなたを助けるかもしれません。私の答えでは、GoogleでスキャンしたバージョンのPro Djangoにもリンクしています。これは、この種のことに対する優れたソリューションを備えています。理想的には、あなたが本を買うことができればそれがより良いと確信しています、しかしグーグルはとにかく関連する章のほとんどを持っているようです。

0
Steve Jalim