使Django Admin仅列出用户拥有的文件

时间:2013-12-17 09:45:50

标签: python django django-admin

我有一个包含文件及其信息的表格。 我希望django admin只列出当前登录用户所拥有的文件,该怎么办?

admin.py

from django.contrib import admin
from .models import Contentfile

class FileAdmin(admin.ModelAdmin):
    change_form_template = 'progressbarupload/change_form.html'
    add_form_template = 'progressbarupload/change_form.html'
    date_hierarchy = "created_at"
    #fields = ("title","slug", "file_type","content", "published", "file_owner")
    #prepopulated_fields = {"slug" : ("title",)}
    fields = ("content",)
    list_display = ["published", "title", "file_type", "file_owner", "updated_at"]
    list_display_links = ["title"]
    list_editable = ["published"]
    list_filter = ["published","file_type", "updated_at"]
    search_fields = ["title"]

    def save_model(self, request, contentfile, form, change):
              contentfile.file_owner = request.user
              contentfile.save()


admin.site.register(Contentfile, FileAdmin)

models.py

from django.db import models
from django.contrib.auth.models import User
from fileservice.formatChecker import ContentTypeRestrictedFileField
from south.modelsinspector import add_introspection_rules
import os
from django.dispatch import receiver
from django.utils.translation import ugettext_lazy as _
from django.core.files.storage import default_storage as storage
add_introspection_rules([
    (
        [ContentTypeRestrictedFileField], # Class(es) these apply to
        [],         # Positional arguments (not used)
        {           # Keyword argument
            "content_types": ["content_types", {}],
            "max_upload_size": ["max_upload_size", {}]
        },
    ),
], ["^fileservice\.formatChecker\.ContentTypeRestrictedFileField"])

class Contentfile(models.Model):
    content = ContentTypeRestrictedFileField(upload_to='uploads/', content_types=['video/mp4', 'application/pdf', 'image/gif', 'image/jpeg', 'image/png'],max_upload_size=52428800,blank=True, null=True, help_text='Upload a file to add it to the content the app displayes')
    created_at = models.DateTimeField(auto_now_add=True, editable=False)
    updated_at = models.DateTimeField(auto_now=True, editable=False)
    title = models.CharField(max_length=255, unique=True)
    file_type = models.CharField(max_length=5)
    published = models.BooleanField(default=True)
    file_owner = models.ForeignKey(User, related_name='Contentfiles')

    class Meta:
        ordering = ["title"]

    def __unicode__(self):
        return self.title

    def save(self, *args, **kwargs):
        file_name = os.path.basename(self.content.name)
        self.file_type = file_name.split('.')[-1]
        self.title = file_name.split('.')[0]
        self.published = True
        super(Contentfile, self).save(*args, **kwargs)



@receiver(models.signals.post_delete, sender=Contentfile)
def auto_delete_file_on_delete(sender, instance, **kwargs):
    """Deletes file from filesystem
    when corresponding `MediaFile` object is deleted.
    """
    if instance.content:
        instance.content.delete(save=False)

@receiver(models.signals.pre_save, sender=Contentfile)
def auto_delete_file_on_change(sender, instance, **kwargs):
    """Deletes file from filesystem
    when corresponding `MediaFile` object is changed.
    """
    if not instance.pk:
        return False

    try:
        old_file = Contentfile.objects.get(pk=instance.pk).content
    except Conentfile.DoesNotExist:
        return False

    new_file = instance.content
    if not old_file == new_file:
        old_file.delete(save=False)

1 个答案:

答案 0 :(得分:0)

您需要继承admin.ModelAdmin并覆盖queryset方法。

在我的头顶,这样的事情应该做:

# Customised ModelAdmin classes
class FileAdmin(admin.ModelAdmin):

def queryset(self, request):
    queryset = super(FileAdmin, self).queryset(request)
    queryset = queryset.filter(file_owner__user = request.user)
    return queryset