Count files each user has uploaded and approved

匿名 (未验证) 提交于 2019-12-03 01:45:01

问题:

I am building a Django app for uploading files. I would like to be able to count the number of files a users has and which are approved. I have a model with a Boolean 'approved' field. This model is in admin.py.

In 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) 

I would like an integer in another model 'new_user_model', which is in another app, to increase an integer field 'files' by one when a file is approved in the admin site. This way I could keep track of how many files have been approved for each user.

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

The model for the files,

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()..................... ................................................... 

So I want the files field in new_user_model to increase by one when a file is 'approved' and the save button hit in the admin site. Also if the 'approved' is unchecked I would need the 'files' field to reduce by one.

How could this be done?

Updated:

Ultimately I would like to be able to display the number of files a user has on the site.

Thanks,

回答1:

You can add a custom admin action which marks the files as approved. These are passed a request object which you can use to grab your NewUserModel. (You may want to remove 'Model' from your Model names, seems a bit redundant, but personal taste I suppose :)

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() 

That being said, if you did want to keep track of who approved what:

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

then the admin action above would just be:

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

and you would be able to get the user's file count by doing:

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


回答2:

I finally got a chance to complete this?

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) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!