可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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)