Я довольно новичок в django, и у меня проблема, и я хотел бы запросить некоторую помощь.Django: inlineformset_factory, передавая параметры/переменные
Я получаю сообщение об ошибке с прохождением моих пользовательских параметров в моей форме, которая говорит
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(....)
Что я делаю неправильно, или я делаю это правильно? Большое спасибо.
UPDATE
Я попытался с помощью 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
для фильтрации ModelChoiceField
QuerySet в SomeForm с помощью __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
ошибка
Большое спасибо за ответ, я попытался с помощью 'myformset.form = STATICMETHOD (Карри (SomeForm, my_arg = SomeValue))' и теперь я получаю сообщение об ошибке: '< DjangoObject> не JSON serializable' –
Просто по ошибке я не думаю, что смогу вам помочь. Мне лично никогда не нужно было отправлять дополнительный параметр во внутреннюю форму, поэтому я не совсем уверен, что лучший подход для этого.Когда у меня будет время, я попробую сам и опубликую вас и обновит, до тех пор - продолжаю читать :) – Todor
Я отправлю еще один вопрос, потому что я его протестировал, и это совсем другое дело, хорошо прочитайте, спасибо, указав мне на вправо –