2016-10-15 3 views
0

ファイルをアップロードするためのDjangoアプリを構築しています。ユーザーが所有しているファイルと承認されているファイルの数を数えたいと思っています。私はブール '承認された'フィールドを持つモデルを持っています。このモデルはadmin.pyにあります。 admin.py各ユーザがアップロードして承認したカウントファイル

from django.contrib import admin 
from .models import FileModel 
from .forms import FileForm 
class FileModelAdmin(admin.ModelAdmin): 
    form = FileForm 
    fields = ('title', 'description', 'categories', 'pub_date', 'submitted_date', 'author', 'user', 'approved', 'upload', 'vote') 
    # pass                                    
    list_display = ['title', 'approved', 'author', 'user', 'categories', 'description', 'pub_date', 'submitted_date', 'upload', 'vote'] 
admin.site.register(FileModel, FileModelAdmin) 

enter image description here

とき私は1つで整数フィールド「ファイル」を高めるために、他のアプリである別のモデル「new_user_model」に整数を希望ファイルは管理サイトで承認されています。この方法で、各ユーザーのために承認されたファイルの数を追跡することができます。

class NewUserModel(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    # user = models.ForeignKey(User)                             
    files = models.IntegerField(default=0) 

ファイルのためのモデル、

class FileModel(models.Model): 
    title = models.CharField(max_length=100) 
    description = models.CharField(max_length=255) 
    pub_date = models.DateTimeField('date published') 
    submitted_date = models.DateTimeField('date submitted') 
    author = models.CharField(max_length=255) 
    user = models.ForeignKey(User, default=6) 
    approved = models.BooleanField(default=False) 
    upload = models.FileField()..................... 
................................................... 

だから私は、ファイルが「承認」されたものとadminサイトでヒット保存ボタンにより増加するnew_user_model内のファイルのフィールドをしたいです。また、「承認済み」がチェックされていない場合は、「ファイル」フィールドを1つ減らす必要があります。

どうすればいいですか?

更新日:

を最終的に私は、ユーザーがサイト上で持っているファイルの数を表示できるようにしたいと思います。

enter image description here

あなたが承認されたとしてファイルをマークしcustom admin actionを追加することができますおかげで、

+1

FileModelに 'approved_by'外部キーを使用したくないですか?この方法で、誰かが承認したファイルの数を数え、承認したファイルを知ることができます。 –

+0

これは正しい方法と言えます。だから、これはUserにとっての外来だろうか? –

+0

私は、ユーザーごとに承認されたファイルの数を数える必要がないようなやり方でこれをしようとしていました。代わりに、承認されたファイルの数を管理者が承認するたびに更新したいと考えています。これは、処理が少なくてすみます。しかし、それはファイルの数がすでに利用可能である必要があることを意味します。それが私が立ち往生している場所です。 –

答えて

0

私はついにこれを完成させましたか?

from django.contrib import admin 
from .models import FileModel 
from django.contrib.auth.models import User 
from .forms import FileForm 
from crudapp.models import NewUserModel 
#from django.db import models 

from django.core.exceptions import PermissionDenied 
from django.contrib import admin 
from django.contrib.admin.actions import delete_selected as delete_selected_ 

# see https://gist.github.com/rudyryk/4190318 
# overrides and recreates delete_selected 
def delete_selected(modeladmin, request, queryset): 
    if not modeladmin.has_delete_permission(request): 
     raise PermissionDenied 
    if request.POST.get('post'): 
     for obj in queryset: 
      obj.delete() 
    else: 
     return delete_selected_(modeladmin, request, queryset) 
delete_selected.short_description = "Delete selected objects" 

class FileModelAdmin(admin.ModelAdmin): 
    form = FileForm 
    fields = ('title', 'description', 'categories', 'pub_date', 'submitted_date', 'author', 'user', 'approved', 'upload', 'vote') 
    # pass 
    list_display = ['title', 'approved', 'author', 'user', 'categories', 'description', 'pub_date', 'submitted_date', 'upload', 'vote'] 
    actions = ['approve_files', 'delete_selected'] 

    def approve_files(self, request, obj): 
     for qs in obj: 
      print "run number..." 
      author = qs.author 
      adminApproved = qs.approved # approved status on admin site 
      userInstance = User.objects.get(username=author) 
      id = qs.id 
      item = FileModel.objects.get(pk=id) 
      approved = item.approved # approved status in FileModel 
      id = userInstance.id 
      item = NewUserModel.objects.get(user_id=id) 
      print "existentialism" 
      print "approved: %s" %(approved) 
      print "adminApproved: %s" %(adminApproved) 
      if(approved == False): 
       item.files += 1 
      item.save() 
     obj.update(approved = True) 
     #NewUserModel.save() 
     #obj.save() 

    def save_model(self, request, obj, form, change): 
     id = obj.id 
     item = FileModel.objects.get(pk=id) 
     # Test if file 'approved' has been changed on admin site 
     if(item.approved != obj.approved): 
      author = obj.author 
      userInstance = User.objects.get(username=author) 
      id = userInstance.id 
      item = NewUserModel.objects.get(user_id=id) 
      if(obj.approved == True): 
       item.files += 1 
       item.save() 
      else: 
       item.files -= 1 
       item.save() 
     obj.save() 

    def delete_model(self, request, queryset): 
     print "we are inside delete_model()" 
     author = queryset.author 
     userInstance = User.objects.get(username=author) 
     id = queryset.id 
     item = FileModel.objects.get(pk=id) 
     approved = item.approved # approved status in FileModel 
     #filename=obj.profile_name+".xml" 
     #os.remove(os.path.join(obj.type,filename)) 
     id = userInstance.id 
     item = NewUserModel.objects.get(user_id=id) 
     # -1 for file in filemodel only if approved 
     if approved == True: 
      item.files -= 1 
      item.save() 
      print "inner part of delete_model()" 
     queryset.delete() 

    # The 'Delete selected' action 
    def delete_selected(self, request, queryset): 
     print "we are inside delete_selected()" 
     for obj in queryset: 
      author = obj.author 
      adminApproved = obj.approved # approved status on admin site 
      userInstance = User.objects.get(username=author) 
      id = obj.id 
      item = FileModel.objects.get(pk=id) 
      approved = item.approved # approved status in FileModel 
      id = userInstance.id 
      item = NewUserModel.objects.get(user_id=id) 
      # For the case where a file is deleted but was approved yet 
      if approved == True: 
       item.files -= 1 
       print "inner part of delete_selected()" 
       item.save() 
      print "running for each iteration of obj" 
     queryset.delete() 

admin.site.register(FileModel, FileModelAdmin) 
1

。これらはあなたのNewUserModelをつかむのに使うことができるリクエストオブジェクトに渡されます。 (あなたのモデル名から「モデル」を削除することがあり、少し冗長なようだが、あなたは何を承認した者を追跡したいなかった場合は個人的な好みは、私は、言われていること:)

class FileModelAdmin(admin.ModelAdmin): 
    form = FileForm 
    fields = ('title', 'description', 'categories', 'pub_date', 'submitted_date', 'author', 'user', 'approved', 'upload', 'vote') 
    # .... 
    actions = ['approve_files'] 
    def approve_files(self, request, queryset): 
     # Queryset can be greater than 1 
     queryset.update(approved=True) 
     user = request.user 
     # I keep wanting to put underscores in... 
     user_files_count = user.newusermodel.files 
     # Get the amount of Files in the query, may be more than one 
     user.newusermodel.files = user_files_count + queryset.count() 
     user.newusermodel.save() 

を想定:

class FileModel(models.Model): 
    title = models.CharField(max_length=100) 
    # ... 
    approved_by = models.ForeignKey('auth.User') 

その後、上記の管理アクションは、単に次のようになります。

def approve_files(self, request, queryset): 
    # Queryset can be greater than 1 
    queryset.update(approved_by=request.user) 

、あなたが実行して、ユーザーのファイル数を取得することができるだろう:

user = Users.objects.get(id=some_id) 
file_count = user.filemodel.all().count() 
+0

あなたが与えたコードの最初のブロックだけを使用すると、私はエラーを受け取ります。 "RelatedObjectDoesNotExist at/adminfileuploader/filemodel/ ユーザーにはnewusermodelがありません。 との問題点、 「user_files_count = user.newusermodel.files」 –

+0

私はアンダースコアで、「new_user_model」が、運がそれを試した、私は忘れてしまった –

+0

、crudapp.modelsからNewUserModel –

関連する問題