【问题标题】:Django: inlineformset_factory, passing parameters/variablesDjango:inlineformset_factory,传递参数/变量
【发布时间】:2016-06-02 01:18:41
【问题描述】:

我是 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 错误

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

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

    如果您确实需要将my_arg 传递给您的内心SomeForm,请查看以下问题:hereherehere

    更新:

    据我所知,您需要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)
    

    【讨论】:

    • 非常感谢您的回答,我尝试使用myformset.form = staticmethod(curry(SomeForm, my_arg=somevalue)),现在出现错误:<DjangoObject> is not JSON serializable
    • 只是由于错误,我认为我无法帮助您。我个人从来不需要向内部表单发送额外的参数,所以我不太确定最好的方法是什么。当我有时间时,我会自己尝试并发布并更新,直到那时 - 继续阅读:)
    • 我会发布另一个问题,因为我已经对其进行了测试,这完全是另一回事,好好阅读,感谢您为我指明正确的方向
    • 我收到了 [u'ManagementForm data is missing or has been tampered with'] 错误
    • 是的,它在我的模板中,我认为是 BaseFormSet 中的 for 循环,因为它是 Tampered with,无论如何我所做的工作都有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2018-10-28
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多