python - 如何从使用 Django 中主要形式的 pk 的管理员内联自定义字段的查询集?

标签 python django django-forms

在 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 内联表单有一个 Gallery 选择器。 我需要像这样自定义查询集:

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 以执行正确的查询集。

我该怎么做?

最佳答案

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

即,在您看来:

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()

关于python - 如何从使用 Django 中主要形式的 pk 的管理员内联自定义字段的查询集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5108994/

相关文章:

python - 在 django shell 中连接到不同的数据库

python - Django-admin:无法访问管理后端 "attempt to write a readonly database"

python - Django 表单在模型表单上无效

django - 如何在 Django 中提交后清除表单字段

python - psycopg2 无法执行多个查询

python - 在 Kubuntu 11.04 上更新到 Python 3——我应该/应该卸载以前的版本吗?

Python django 渲染时重定向 url

Django:创建类似于管理界面的内联表单集

python - 如何使用python将单列文本文件解析为表格?

python - 将 Mercurial 迁移到 GitHub