【问题标题】:How to customize a Queryset of a Field from a admin Inline that uses a pk of the primary form in Django?如何从使用 Django 中主要表单的 pk 的管理员内联自定义字段的查询集?
【发布时间】:2011-02-24 18:41:06
【问题描述】:

在 Django 中自定义表单字段的查询集并不难。 Like this

但是,假设我有以下模型:

#models.py

class Work(Model):
    name = models.CharfField(...)
    #some fields

class Gallery(Model):
    work = models.ForeignKey(Work)

class Photo(Model):
   gallery = models.ForeignKey(Gallery)

class StageOfWork(Model):
    work = models.ForeignKey(Work)
    gallery = models.ForeignKey(Gallery)
    #some fields

还有一个这样的 admin.py

#admin.py

class StageOfWorkAdmin(admin.TabularInline):
    model = StageOfWork
    form = StageOfWorkForm
    extra = 1

class WorkAdmin(admin.ModelAdmin):
    inlines = [EtapaObraAdmin]

我有这个问题:当我编辑一个作品时,存在许多 StageOfWorks 的表单内联,这些 StageOfWorks 内联表单有一个画廊选择器。 我需要像这样自定义此画廊的查询集

class StageOfWorkForm(ModelForm):

    def __init__(self, *args, **kwargs):        
        super(StageOfWorkForm, self).__init__(*args, **kwargs)
        if 'instance' in kwargs:
             self.fields['gallery'].queryset = Gallery.objects.filter(work__id=self.instance.work.id)

但这仅适用于正在编辑表单的表单。我需要在 init 方法的上下文中获取一个工作 ID 来执行正确的查询集。

我该怎么做?

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    我能够做到这一点的唯一方法是将您需要的数据传递到表单类的实例中。

    即,在您看来:

    def view(request):
        ...
        work = <whatever>
        form = StageOfWorkForm(work, request.POST)
        ...
    

    那么,你的表单需要工作对象:

    class StageOfWorkForm(ModelForm):
        def __init__(self, work, *args, **kwargs):
            super(StageOfWorkForm, self).__init__(*args, **kwargs)
            self.fields['gallery'].queryset = work.gallery_set.all()
    

    【讨论】:

      【解决方案2】:

      我没有做过这个确切的事情,但我做了类似的事情。我使用了 Smart Selects Django 插件。可以在这里找到:https://github.com/digi604/django-smart-selects

      我已将它用于管理中的过滤选择,但它是在常规模型中,而不是内联,但插件很可能也在内联中工作。我至少会检查一下。

      海莉

      【讨论】:

      • 哇!这是一个时尚时尚的项目!它也适用于普通表单和内联!
      猜你喜欢
      • 2018-03-08
      • 2019-05-26
      • 1970-01-01
      • 2011-09-28
      • 2011-07-03
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 2013-04-05
      相关资源
      最近更新 更多