我有以下模型,其中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的某个地方监督了一个可以给我预期结果的选项吗?任何帮助将不胜感激。
答案 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
希望将来可以帮助任何人!