2014-09-07 3 views
0

Я пытаюсь добавить пользовательские аргументы модели полей формы, но я получаю ошибку __init__() got an unexpected keyword argument 'nginit':Добавление аргументов поля пользовательских форм

мое поле:

self.fields['formdata.name'] = forms.CharField(label = 'Your name', nginit = None, required = True, max_length = 100) 

мой подкласс Модификатор:

from django import forms 
old_build_field = forms.fields.Field 
class build_field(old_build_field): 
    def __init__(self, nginit = False, *args, **kwargs): 
     super(build_field, self).__init__(*args, **kwargs) 
     self.nginit = nginit 

forms.fields.Field = build_field 

ответ

0

Предположительно, вы пытаетесь обезвредить базовый класс Field в надежде, что подклассы, такие как CharField, наследуют новый класс. К сожалению, это не так, как это работает. Все наследование классов выполняется во время импорта, поэтому CharField всегда наследует исходный класс Field, а не вашу версию с обезьяной.

Немного лучший подход заключается в том, чтобы monkeypatch использовать метод __init__ непосредственно из поля, так как он вызывается только при создании экземпляра класса. Однако даже тогда вам нужно быть уверенным, что ваш monkeypatching выполняется до самого определения формы: поскольку CharField создается непосредственно на уровне класса в форме, снова это будет сделано во время импорта. Пока модификация выполняется до этого в модуле формы, она должна работать.

Возможно, есть намного лучшие способы сделать это, я должен сказать. Например, вы можете добавить параметры nginit в каждое из полей непосредственно в собственном методе init формы.