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)
我是 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)