Django Admin:限制内联表单的查询集选择

我有一个带内联表单的Django管理表单,如下所示。它有很多领域。模型Placephotos = models.ManyToManyField(Photo),而Photo是另一个Django模型。

问题在于我有Photo的实例太多,单击我在Django admin下编辑表单,我得到了一个带有所有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,]
caowei5323013 回答:Django Admin:限制内联表单的查询集选择

您需要保存父表单正在更新的 Place 对象的副本,并使用该对象作为限制选择 Photo 表单字段的线索。内联表格。

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,obj=None,**kwargs):
        request._place_obj = obj
        return super(PlaceAdmin,self).get_form(request,obj,**kwargs)

此答案可以帮助您进一步了解详细信息: https://stackoverflow.com/a/4236159/11326730

本文链接:https://www.f2er.com/3130788.html

大家都在问