YUI.io (ajax) и Django - обновление работает только один раз, YUI не может снова найти форму - PullRequest
2 голосов
/ 31 октября 2009

Я использую YUI 3.0 io для отправки данных формы с помощью ajax. Поля формы создаются из представления django (ModelForm). При первой загрузке формы я обновляю поле и отправляю форму с помощью YUI onclick, который вызывает обратный вызов io, который запускает представление django и снова возвращает ModelForm с данными обновления. Это работает один раз (сохраняет в базу данных, отображает данные обновления в форме). После этого поля формы обновления не распознаются, и когда я снова отправляю сообщение POST, новые изменения не регистрируются.

//Ajax call to Load Member Info
YUI().use("node-base", "io-form","node", function(Y) {
    var formObj = Y.one('#MemberForm')
    var uri = "http://localhost:8000/MemberInfo/{{ member_id }}";
    var cfg = {
        method:'POST',
        form: {
            id: formObj
        }
    }
     function complete(id, o) {
      var id = id; // Transaction ID.
      var data = o.responseText; // Response data.
      document.getElementById('InputDiv').innerHTML = data;//the data is the memberinfo html template w/ data
    };

    function start(transactionid, arguments)
    {
        document.getElementById('InputDiv').innerHTML = "processing...";
    }

    Y.on('io:complete', complete, this);
    Y.on('io:start', start, this);

    var request = Y.io(uri);//run callback on load. don't POST, just load'

    function LoadMemberAjax()
    {
         Y.io(uri, cfg);//callback, POST.
    }
    Y.on("click", LoadMemberAjax, "#btnMemberInfo");
    }
);


#Load Member Info - ajax call
def MemberInfo(request, member_id):
existingMember = get_object_or_404(Member, pk=member_id)
if request.method == "POST":
    if 'userlogin' in request.POST: #we will get username and pwd from login and find person
        NewMember = MemberForm(instance=existingMember)
    else:
        f = MemberForm(request.POST, instance = existingMember)
        if f.is_valid():
            f.save()
            NewMember = MemberForm(instance=existingMember)

else:
    NewMember = MemberForm(instance=existingMember)

return render_to_response("MemberInfo.html", {"Member": NewMember,})

HTML:

<body>   
  <form id="MemberForm">
      <div id="InputDiv">Loading Your Member Information...One Moment...
      </div>
      <input type="button" id="btnMemberInfo" value="save">
  </form>

Шаблон из Django возвращается как 'data'

 {% for field in Member %}
 {{ field.label_tag }}
 {{ field }}
 {% endfor %}

Ответы [ 2 ]

0 голосов
/ 01 ноября 2009

Еще одна вещь, о которой следует помнить, это то, что если у вас включено промежуточное ПО CSRF, оно будет повторять попытки пост-публикации, подобные этой, неработающей.

0 голосов
/ 01 ноября 2009

Я не очень хорошо знаю YUI, но я думаю, что здесь происходит то, что, когда AJAX перезагружает форму, он также создает совершенно новую кнопку - у которой больше нет события onclick, связанного с LoadMemberAjax. Вам, вероятно, придется перепривязать его, перезапустив Y.on("click", LoadMemberAjax, "#btnMemberInfo"); в конце функции complete.

Или это может быть эквивалент вызова jQuery live, который можно использовать, чтобы гарантировать сохранение привязки даже после воссоздания элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...