gpt4 book ai didi

python - 将查询集传递给django inlineform中的foreignkeyfield

转载 作者:行者123 更新时间:2023-11-28 22:52:56 25 4
gpt4 key购买 nike

我遇到了一个小问题,我认为这很常见。这是非常笼统的问题描述:

class Ownable(models.Model):
user = models.ForeignKey(django.contrib.auth.models.User)

class Meta:
abstract = True


class Bowl(Ownable):
pass


class Pea(Ownable):
bowl = models.ForeignKey(bowl)

关系是:User [1:n] Bowl用户 [1:n] 豌 bean 碗 [1:n] 豌 bean

现在,当我想创建一个新的 Pea 时,我还需要将它分配给一个 Bowl,如下所示:

def create_new_pea(request):
PeaFrom = inlineformset_factory(django.contrib.auth.models.User, Pea)
return render(request, 'app/pea/create.html', {'formset': PeaFrom()})

在这个过程中,我如何才能将 QuerySet 传递给 bowl 字段,因为我认为用户只能将 bean 放入他自己的碗中.

我很乐意提出建议。我尝试为 formset-factory 创建自定义表单,但我需要 request 实例来了解当前用户。

最佳答案

一种简单的方法是在实例化表单集之后执行此操作。

def create_new_pea(request):
PeaFormset = inlineformset_factory(django.contrib.auth.models.User, Pea)
formset = PeaFormset(instance=request.user)
for form in formset:
form.fields['bowl'].queryset = request.user.bowl_set.all()
return render(request, 'app/pea/create.html', {'formset': formset}

我认为可以将此行为构建到自定义 Formset 类中,覆盖 _construct_forms 方法:

class UserLimitedFormset(BaseInlineFormset):
def _construct_forms(self):
super(UserLimitedFormset, self)._construct_forms()
for form in self:
form.fields['bowl'].queryset = self.instance.bowl_set.all()

PeaFormset = inlineformset_factory(django.contrib.auth.models.User, Pea, formset=UserLimitedFormset)

要使用回调,我认为您需要一个闭包或一个 functools.partial 来在创建表单集之前记录用户。可能是这个,虽然它未经测试而且我对关闭感到生疏:

def create_new_pea(request):
user = request.user
def set_queryset(f, **kwargs):
formfield = f.formfield(**kwargs)
if f.name == 'bowl':
formfield.queryset = user.bowl_set.all()
return formfield
PeaFormset = inlineformset_factory(django.contrib.auth.models.User, Pea, formfield_callback=set_queryset)

关于python - 将查询集传递给django inlineform中的foreignkeyfield,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19867765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com