[英]Django Admin: Limit query-set selection for a inline form
我有一个 Django 管理表单和一个内联表单,如下所示。 它有许多领域。 models Place
有photos = models.ManyToManyField(Photo)
,而Photo
是另一个 Django model。
问题是我有太多Photo
实例,单击我在 Django 管理员下编辑表单,我得到一个包含所有 Photo 实例选择的下拉列表。
如何限制仅与Place
有关系的选择?
class Photoinline(admin.TabularInline):
model = Place.photos.through
extra = 1
readonly_fields = ('preview', 'my_order',)
def preview(self, obj):
if obj.photo:
id = obj.photo_id
photo = Photo.objects.get(id=id)
return mark_safe('<img src="/media/%s" width="150" />' % (photo.photo))
else:
return mark_safe('Empty, please upload an image')
def my_order(self, obj):
id = obj.photo_id
photo = Photo.objects.get(id=id)
if not photo.order:
return ""
return photo.order
class PlaceAdmin(admin.ModelAdmin):
list_display = ('name', 'city', 'state', 'country')
exclude = ('photos',)
formfield_overrides = {
models.ForeignKey: {'widget': Select(attrs={'style':'width: 350px;'})},
models.FloatField: {'widget': Select(attrs={'style':'min-width: 350px;'})},
models.URLField: {'widget': TextInput(attrs={'style':'width: 350px;'})},
models.CharField: {'widget': TextInput(attrs={'style':'width: 350px;'})},
models.TextField: {'widget': Textarea(attrs={'style':'width: 350px;height: 38px;'})}
}
inlines = [
Photoinline,
]
您需要保存父表单正在更新的Place object 的副本,并使用该 object 作为线索来限制内联 forms 的照片表单字段的选择。
class Photoinline(admin.TabularInline):
model = Place.photos.through
extra = 1
readonly_fields = ('preview', 'my_order',)
def preview(self, obj):
if obj.photo:
id = obj.photo_id
photo = Photo.objects.get(id=id)
return mark_safe('<img src="/media/%s" width="150" />' % (photo.photo))
else:
return mark_safe('Empty, please upload an image')
def my_order(self, obj):
id = obj.photo_id
photo = Photo.objects.get(id=id)
if not photo.order:
return ""
return photo.order
def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
formfield = super(Photoinline, self).formfield_for_foreignkey(db_field, request, **kwargs)
if db_field.name == 'photo':
if request._place_obj is not None:
formfield.queryset = formfield.queryset.filter(place__exact = request._place_obj)
else:
formfield.queryset = formfield.queryset.none()
return formfield
class PlaceAdmin(admin.ModelAdmin):
list_display = ('name', 'city', 'state', 'country')
exclude = ('photos',)
formfield_overrides = {
models.ForeignKey: {'widget': Select(attrs={'style':'width: 350px;'})},
models.FloatField: {'widget': Select(attrs={'style':'min-width: 350px;'})},
models.URLField: {'widget': TextInput(attrs={'style':'width: 350px;'})},
models.CharField: {'widget': TextInput(attrs={'style':'width: 350px;'})},
models.TextField: {'widget': Textarea(attrs={'style':'width: 350px;height: 38px;'})}
}
inlines = [
Photoinline,
]
def get_form(self, request, obj=None, **kwargs):
request._place_obj = obj
return super(PlaceAdmin, self).get_form(request, obj, **kwargs)
这个答案可以帮助你了解更多细节: https://stackoverflow.com/a/4236159/11326730
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.