简体   繁体   English

Django:inlineformset_factory,传递参数/变量

[英]Django: inlineformset_factory, passing parameters/variables

I am fairly new with django and I am having a problem and would like to request some assistance. 我对django相当陌生,遇到问题,希望寻求帮助。

I am getting an error with passing my custom param to my form that says 将自定义参数传递给我的表单时出现错误

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']

It also say this at the error page: 它还在错误页面上这样说:

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

This is my 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)

And my views: 我的看法:

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

What I am doing wrong or am I doing it right? 我做错了还是我做对了? Many thanks. 非常感谢。

UPDATE UPDATE

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

And my views look like this: 我的看法如下所示:

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

And It's working, I am using the my_arg to filter the SomeForm's ModelChoiceField queryset via __init__ and my form looks like this: 并且它正在工作,我正在使用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)

And upon save I get <DjangoObject> is not JSON serializable error 并且保存后我得到<DjangoObject> is not JSON serializable错误

You get this error because your inner form SomeForm does not receive my_arg as a parameter in kwargs . 之所以会出现此错误,是因为您的内部表单SomeForm不会在kwargs my_arg作为参数接收。 And because you use kwargs.pop('my_arg') without a default value -> you get a KeyError . 并且因为您使用不带默认值的kwargs.pop('my_arg') ->会得到KeyError If you use .pop with a default value provided ( kwargs.pop('my_arg', None) ) you wont get a KeyError . 如果您使用.pop与提供的默认值( kwargs.pop('my_arg', None) ),你不会得到一个KeyError

If you really need to pass my_arg to your inner SomeForm take a look at this questions: here , here and here 如果您确实需要将my_arg传递到内部SomeForm请查看以下问题: 此处此处此处

UPDATE: 更新:

As far as I can see, you need my_arg to filter queryset of a field. 据我my_arg ,您需要my_arg来过滤字段的查询集。 Well you don't need to this at inner_form.__init__ , but after constructing all forms inside your formset.__init__ method. 好吧,您不需要在inner_form.__init__执行此inner_form.__init__ ,而是在您的formset.__init__方法中构造了所有表单之后。

Something like this: 像这样:

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM