簡體   English   中英

Django 管理員:限制內聯表單的查詢集選擇

[英]Django Admin: Limit query-set selection for a inline form

我有一個 Django 管理表單和一個內聯表單,如下所示。 它有許多領域。 models Placephotos = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM