2016-02-20 8 views
1

Я довольно новичок в 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 ошибка

ответ

1

Вы получаете эту ошибку, потому что ваша внутренняя форма SomeForm не получает my_arg в качестве параметра в kwargs. И поскольку вы используете kwargs.pop('my_arg') без значения по умолчанию -> вы получаете KeyError. Если вы используете .pop со значением по умолчанию (kwargs.pop('my_arg', None)), вы не получите KeyError.

Если вам действительно нужно пройти my_arg к своему внутреннему SomeForm взглянуть на эти вопросы: here, here и here

UPDATE:

Насколько я понимаю, вам нужно my_arg к filter queryset поля. Ну, вам это не нужно в 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) 
+0

Большое спасибо за ответ, я попытался с помощью 'myformset.form = STATICMETHOD (Карри (SomeForm, my_arg = SomeValue))' и теперь я получаю сообщение об ошибке: '< DjangoObject> не JSON serializable' –

+0

Просто по ошибке я не думаю, что смогу вам помочь. Мне лично никогда не нужно было отправлять дополнительный параметр во внутреннюю форму, поэтому я не совсем уверен, что лучший подход для этого.Когда у меня будет время, я попробую сам и опубликую вас и обновит, до тех пор - продолжаю читать :) – Todor

+0

Я отправлю еще один вопрос, потому что я его протестировал, и это совсем другое дело, хорошо прочитайте, спасибо, указав мне на вправо –

Смежные вопросы