python - Django:inlineformset_factory,传递参数/变量

标签 python django django-forms

我对 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过滤 SomeForm 的 ModelChoiceField查询集通过 __init__我的表单如下所示:

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 , herehere

更新:

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

关于python - Django:inlineformset_factory,传递参数/变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35522728/

相关文章:

没有参数的 Python 'raise' : what is "the last exception that was active in the current scope"?

django - 使用 QuerySet.values() 时获取模型实例

python - 获取用户列表以及组成员身份?

python - CreateView 中的多个表单和表单集

python - 使用类扩展 Django ModelForm

python - 将 txt 转换为 xlsx 时出现 MemoryError

python - python中的回文迭代检查器

python - 如何获取Numba字典的大小?

python - Django和Node –如何运作?

python - Django 表单输入字段样式