问题
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)
来源:https://stackoverflow.com/questions/40063646/count-files-each-user-has-uploaded-and-approved