Джанго, повторяющийся вопрос vars / cache? - PullRequest
0 голосов
/ 09 апреля 2010

Я пытаюсь создать лучший / более мощный класс форм для Django. Это работает хорошо, за исключением этих подформ. На самом деле, он отлично работает сразу после перезапуска apache, но после того, как я несколько раз обновляю страницу, мой HTML-вывод начинает выглядеть так:

<input class="text" type="text" id="pickup_addr-pickup_addr-pickup_addr-id-pickup_addr-venue" value="" name="pickup_addr-pickup_addr-pickup_addr-pickup_addr-venue" />

Партия pickup_addr- начинает повторяться много раз. Я искал циклы вокруг кода prefix, которые могли бы вызвать это, но при обновлении страницы выходные данные даже не согласовывались, поэтому я думаю, что что-то где-то кэшируется, но я даже не представляю, как это возможно prefix var должен быть сброшен при инициализации класса, нет? Разве это как-то не что-то инициализирует?

class Form(object):
    count = 0
    def __init__(self, data={}, prefix='', action='', id=None, multiple=False):
        self.fields = {}
        self.subforms = {}
        self.data = {}
        self.action = action
        self.id = fnn(id, 'form%d' % Form.count)
        self.errors = []
        self.valid = True
        if not empty(prefix) and prefix[-1:] not in ('-','_'): prefix += '-'

        for name, field in inspect.getmembers(self, lambda m: isinstance(m, Field)):
            if name[:2] == '__': continue
            field_name = fnn(field.name, name)
            field.label = fnn(field.label, humanize(field_name))
            field.name = field.widget.name = prefix + field_name + ife(multiple, '[]')
            field.id = field.auto_id = field.widget.id = ife(field.id==None, 'id-') + prefix + fnn(field.id, field_name) + ife(multiple, Form.count)
            field.errors = []

            val = fnn(field.widget.get_value(data), field.default)

            if isinstance(val, basestring):
                try:
                    val = field.coerce(field.format(val))
                except Exception, err:
                    self.valid = False
                    field.errors.append(escape_html(err))

            field.val = self.data[name] = field.widget.val = val

            for rule in field.rules:
                rule.fields = self.fields
                rule.val = field.val
                rule.name = field.name

            self.fields[name] = field

        for name, form in inspect.getmembers(self, lambda m: ispropersubclass(m, Form)):
            if name[:2] == '__': continue
            self.subforms[name] = self.__dict__[name] = form(data=data, prefix='%s%s-' % (prefix, name))

        Form.count += 1  

Дайте мне знать, если вам нужно больше кода ... Я знаю, что это много, но я просто не могу понять, что это вызвало! Я даже не использую промежуточное программное обеспечение кеша.


Сначала копируя / клонируя поля, я получаю следующий вывод:

<label for="None">None</label>
<input class="text" type="text" id="id-pickup_address-venue" value="" name="pickup_address-venue" />

field.name и field.label установлены точно так же ... фактически, field.id правильно отображается на <input>, но это же значение внезапно исчезает, когда я пытаюсь напечатать этикетку .. ... разница в том, что бит <input> печатается классом Widget, тогда как label печатается прямо из моего шаблона ... что, я думаю, это ... о, я понял, что каждый все еще ссылается на неустановленное поле уровня класса / статическое поле, а не на поле экземпляра ...

1 Ответ

1 голос
/ 09 апреля 2010

Вы, вероятно, объявляете свои формы следующим образом:

class SomeForm(Form):
    someField = Field(....)
    ...

Теперь это означает, что один экземпляр someField будет фактически использоваться всеми вашими SomeForm экземплярами. В вашем __init__ вы изменяете атрибуты поля, что повлияет на все формы, а не только текущую, включая созданные в будущем.

Чтобы исправить это, вы можете сделать копию поля для каждого экземпляра:

field = copy(field)  #maybe you need deepcopy instead
setattr(self, name, field)   

А затем измените атрибуты копии.

...