Django:inlineformset_factory,传递 parameters/variables

Django: inlineformset_factory, passing parameters/variables

我是 django 的新手,我遇到了问题,想请求帮助。

我在将自定义参数传递到我的表单时遇到错误

KeyError at /someurl
'my_arg'

    Request Method: GET
    Request URL:    http://localhost:8000/
    Django Version: 1.8.2
    Exception Type: KeyError
    Exception Value: 'my_arg'
    Exception Location: ..../forms.py in __init__, line 108(points at 'my_arg = kwargs.pop('my_arg')' line)
    Python Executable:  C:\Python27\python.exe
    Python Version: 2.7.10
    Python Path:    
    ['C:\Users\lolwat\Desktop\ITSWEBSITE',
     'C:\Windows\system32\python27.zip',
     'C:\Python27\DLLs',
     'C:\Python27\lib',
     'C:\Python27\lib\plat-win',
     'C:\Python27\lib\lib-tk',
     'C:\Python27',
     'C:\Python27\lib\site-packages']

它在错误页面上也是这样说的:

Error during template rendering
    ...
    {% for field in form %}
    ...

这是我的表格:

class BaseFormSet(BaseInlineFormSet):
    def __init__(self, *args, **kwargs):
    self.my_arg = kwargs.pop("my_arg")
    super(BaseFormSet, self).__init__(*args, **kwargs)

class SomeForm(ModelForm):
    ...
    def __init__(self, *args, **kwargs):
        my_arg = kwargs.pop('my_arg')
        super(SomeForm, self).__init__(*args, **kwargs)

以及我的观点:

myformset = inlineformset_factory(modelA, modelB, formset = BaseFormSet, form=SomeForm, extra=1, can_delete=True)

def someview(request, obj_id):
    var1 = get_object_or_404(SomeModel, id = obj_id)
    somevalue = var1.ModelFieldValue
    form = myformset (request.POST, my_arg=somevalue)
    if request.method == 'POST':
        ...
    else:
        form = myformset(instance = myinstance, my_arg=somevalue)

     return render(....)

我做错了什么还是我做对了?非常感谢。

更新

我尝试使用 myformset.form = staticmethod(curry(SomeForm, my_arg=somevalue))

我的观点是这样的:

from django.utils.functional import curry

myformset = inlineformset_factory(modelA, modelB, formset = BaseFormSet, form=SomeForm, extra=1, can_delete=True)

def someview(request, obj_id):
    var1 = get_object_or_404(SomeModel, id = obj_id)
    somevalue = var1.ModelFieldValue
    myformset.form = staticmethod(curry(SomeForm, my_arg=somevalue))
    form = myformset (request.POST, my_arg=somevalue)
    if request.method == 'POST':
        ...
    else:
        form = myformset(instance = myinstance, my_arg=somevalue)

     return render(....)

它正在工作,我正在使用 my_arg 通过 __init__ 过滤 SomeForm 的 ModelChoiceField 查询集,我的表单如下所示:

class SomeForm(ModelForm):
   MyField = ModelChoiceField(queryset=SomeModel.objects.none())
    def __init__(self, *args, **kwargs):
        my_arg = kwargs.pop('my_arg', None)
        super(SomeForm, self).__init__(*args, **kwargs)
        self.fields['MyField'].queryset = SomeModel.objects.filter(fkey = my_arg)

保存后我得到 <DjangoObject> is not JSON serializable 错误

您收到此错误是因为您的内部表单 SomeForm 没有接收 my_arg 作为 kwargs 中的参数。因为你使用 kwargs.pop('my_arg') 没有默认值 -> 你得到 KeyError。如果您使用 .pop 并提供默认值 (kwargs.pop('my_arg', None)),您将不会得到 KeyError.

如果你真的需要将 my_arg 传递给你内心的 SomeForm 看看这个问题:here, here and here

更新:

据我所知,您需要 my_arg 来过滤字段的查询集。好吧,您不需要在 inner_form.__init__ 处执行此操作,但是在 formset.__init__ 方法中构建所有表单之后。

像这样:

class BaseFormSet(BaseInlineFormSet):
    def __init__(self, *args, **kwargs):
        my_arg = kwargs.pop("my_arg")
        super(BaseFormSet, self).__init__(*args, **kwargs)
        for form in self.forms:
            form.fields['my_field'].queryset = SomeModel.objects.filter(fkey = my_arg)