Django FilePathField过滤器使用了条目

时间:2017-05-15 22:40:27

标签: python django

我有以下模型,其中FilePathField应该是唯一的:

class Gallery(models.Model):
    template = models.FilePathField(path=".../templates/galleries/", unique=True)

在管理员中,我希望下拉列表仅显示那些尚未使用的条目,但是,为了更容易地在可用答案中进行选择。

毕竟,结果下拉列表中任何已经使用的选项都会给我一个错误,不需要在管理员中显示给我。不幸的是,我遇到了问题。

任何人都可以告诉我在哪里可以插入类似于以下内容的内容:

used = [gallery.template for gallery in Gallery.objects.all()]
return [file for file in files if file not in used]

...或者我可能已经在Django的某个地方监督了一个可以给我预期结果的选项吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

所以,经过大量的挖掘,我自己设法找到了解决方案。如果有人寻求类似的解决方案,我会在这里发布它作为答案:

为您的模型扩展ModelAdmin并实现一个新的get_form()方法,该方法接受您指定的FilePathField的选择并根据您的喜好过滤此列表。

我举一个上面的图库模型的例子:

class GalleryAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        used = [gallery.template for gallery in Gallery.objects.all()]
        form = super(GalleryAdmin, self).get_form(request, obj, **kwargs)
        form.base_fields['template'].choices = [choice for choice in form.base_fields['template'].choices if choice[0] not in used]
        return form

编辑:我注意到这会阻止您更改条目,因为现在将删除最初设置的选项。我设法通过这个小调整来实现这个目标:

class GalleryAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        if obj: # we are changing an entry
            used = [gallery.template for gallery in Gallery.objects.all() if gallery.template != obj.template]
        else: # we are adding a new entry
            used = [gallery.template for gallery in Gallery.objects.all()]
        form = super(GalleryAdmin, self).get_form(request, obj, **kwargs)
        form.base_fields['template'].choices = [choice for choice in form.base_fields['template'].choices if choice[0] not in used] 
        return form

希望将来可以帮助任何人!