2016-07-17 5 views
0

私はdjando 1.8を実行しています。作成したユーザーに現在ログインしているユーザーを保存しようとしています。私はこれを働かせるためにさまざまな組み合わせを試みましたが、私は運が悪いです。Djangoモデルセーブ作成者:

self.created_by = User.objects.get(id=kwargs['request'].user) 

または

self.created_by = User.objects.get(id=request.user) 

は、私が手に:私はコメントアウトコードのいずれかをしようとした場合

@python_2_unicode_compatible # only if you need to support Python 2 
class Project(models.Model): 
    name = models.CharField(max_length=50, verbose_name="Name") 
    jobNumber = models.CharField(max_length=8) 
    shopOut = models.DateTimeField(null=True) 
    shopIn = models.DateTimeField(null=True) 
    completion = models.DateTimeField(null=True) 
    installation_date = models.DateTimeField(null=True) 
    contractor = models.ForeignKey(Contractor, on_delete=models.CASCADE, default=101) 
    created_by = models.ForeignKey(User, related_name='Project_created_by') 
    created_date = models.DateTimeField(auto_now_add=True) 
    modified_by = models.ForeignKey(User, related_name='Project_modified_by') 
    modified_date = models.DateTimeField(auto_now=True) 
    assigned_to = models.ForeignKey(User, related_name='Project_assigned_to', default=1) 
    status = models.ForeignKey('Status', related_name='Project_status', default=1) 
    def __str__(self): 
     return self.name 
    def save(self, *args, **kwargs): 
     if not self.id: 
      self.created_by = User.objects.get(id=1) 
      #self.created_by = User.objects.get(id=kwargs['request'].user) 
      #self.created_by = User.objects.get(id=request.user) 
      self.modified_by = User.objects.get(id=1) 
      #self.modified_by = User.objects.get(id=kwargs['request'].user) 
      #self.modified_by = User.objects.get(id=request.user) 
      super(Project, self).save(*args, **kwargs) 
      year = datetime.datetime.now().year 
      self.jobNumber = '{}{:04d}'.format(year, self.id) 
     self.modified_by = User.objects.get(id=1) 
     #self.modified_by = User.objects.get(id=kwargs['request'].user) 
     #self.modified_by = User.objects.get(id=request.user) 
     super(Project, self).save(*args, **kwargs) 

:私はそうのように、ユーザIDにハードコーディングで動作するコードを持っています次のエラー:

KeyError at /admin/project/project/add/ 'request'

または

もう一度私の質問は、現在のログインしているユーザーをcreated_byおよびmodified_byフィールドに保存する方法です。

ご協力いただければ幸いです!

+1

あなたが探している場所には、「要求」オブジェクトがありません。 'request'にアクセスするには、ビュー関数/クラスの中にいる必要があります。さらに、モデルは要求の文脈の外で(例えば、シェルからシグナルから)変更することができるので、 'save()'が呼び出されるたびにリクエストとログインしたユーザが存在すると仮定することはできません。 – solarissmoke

+0

また、Django管理者は、管理者が行ったモデル変更の履歴を保持しています(すべてのモデルに「履歴」ビューがあります)。 – solarissmoke

答えて

0

はもう少し検索した後、私はこのpostが、私は自分のコードの大部分を踏襲しますが、ここでは私のものですが見つかりました:

これは私のアプリのフォルダ構造です:

myappの

  • プロジェクト
    • admin.py#変更点
    • 個models.py#changed thi S
    • ...
  • myappの
    • setting.py
    • url.py
    • ...

私の新しいadmin.py

from django.contrib import admin 
from . import models 

class ProjectAdmin(admin.ModelAdmin): 
    fields = ('name', 'jobNumber', 'contractor', 'assigned_to', 'status') 
    def save_model(self, request, obj, form, change): 
     instance = form.save(commit=False) 
     if not hasattr(instance, 'created_by'): 
      instance.created_by = request.user 
     instance.modified_by = request.user 
     instance.save() 
     form.save_m2m() 
     return instance 

admin.site.register(models.Project,ProjectAdmin) 

models.py

import datetime 
from django.db import models 
from django.utils.encoding import python_2_unicode_compatible 
from django.contrib.auth.models import User 
from contractor.models import Contractor 

@python_2_unicode_compatible # only if you need to support Python 2 
class Project(models.Model): 
    name = models.CharField(max_length=50, verbose_name="Name") 
    jobNumber = models.CharField(max_length=8) 
    shopOut = models.DateTimeField(null=True) 
    shopIn = models.DateTimeField(null=True) 
    completion = models.DateTimeField(null=True) 
    installation_date = models.DateTimeField(null=True) 
    contractor = models.ForeignKey(Contractor, on_delete=models.CASCADE, default=101) 
    created_by = models.ForeignKey(User, related_name='Project_created_by') 
    created_date = models.DateTimeField(auto_now_add=True) 
    modified_by = models.ForeignKey(User, related_name='Project_modified_by') 
    modified_date = models.DateTimeField(auto_now=True) 
    assigned_to = models.ForeignKey(User, related_name='Project_assigned_to', default=1) 
    status = models.ForeignKey('Status', related_name='Project_status', default=1) 
    def __str__(self): 
     return self.name 
    def save(self, *args, **kwargs): 
     if not self.id: 
      super(Project, self).save(*args, **kwargs) 
      year = datetime.datetime.now().year 
      self.jobNumber = '{}{:04d}'.format(year, self.id) 
     super(Project, self).save(*args, **kwargs) 

私はトリックはadmin.pyファイル内の要求をキャッチされると思います。あなたの入力のためのsolarissmokeありがとう!

関連する問題