вызывающая функция из jQuery с Django не работает правильно - PullRequest
1 голос
/ 28 апреля 2011

Я пытаюсь создать страницу, которая ищет пользователей на основе критериев пользователей.Затем он загружает результаты через ответ AJAX в другой DIV:

function search_friends() {
    $("#search-results").show();
    $("#loading1").show();
    var q = $("#id_q").val();
    var type = $("#id_search_type").val();
    $("#loading1").hide();
    $("#results").load("/search/friends/?ajax&q="+encodeURIComponent(q)+"&search_ty­pe="+encodeURIComponent(type));
    return false;
}

Внутри этого нового DIV результатов у меня есть ссылки для каждого пользователя, чтобы иметь возможность добавить их в друзья.Каждая ссылка в этом результате DIV имеет идентификатор каждого пользователя userID и класс user_link.Когда вошедший в систему пользователь нажимает на ссылку, я хочу, чтобы он высветил окно подтверждения, а затем отправил запрос через AJAX.Однако я не могу получить ссылки для отправки через AJAX, как я хочу.У меня есть следующий код:

{% for u in users %}
<div id="results">
    <img src="{{ u.profile_pic }}" class="xsmall-pic" /> <a href="/{{ u.username }}/">{{ u.username }}</a><br />
    <span class="small-date">{{ u.get_full_name }}</span>
    <span class="floatR" id="user_{{ u.id }}_link"><a href="#" id="{{ u.id }}" class="user_link">Add as friend</a></span>
</div>{% endfor %}

<script type="text/javascript" language="javscript">
    $(document).ready(function() {
        var csrf_token = "{{ csrf_token }}";
        $(".user_link").bind('click',function() {
            request_friend($(this).id,csrf_token)
        });
        $("#search-friends-form").submit(search_friends);

    });
</script>

Во внешнем файле JavaScript у меня есть следующее:

function confirm_request()

    return confirm("Are you sure you want to request this user as a friend?");
}

function request_friend(id,token)
    if (confirm_request())
    {
        var data1 = {to_friend: id,csrfmiddlewaretoken: token};
        $.post('/users/requests/friends/'+id+'/?ajax', 
                data1, function(json) {
                    $("#user_"+id+"_link").html(json.status);
                }, "json");
                return false;
    }
    else
    {
        return;
    }
}

Спасибо за любую помощь, так как я не так уж хорош с Javascript

РЕДАКТИРОВАТЬ Функция Python, вызываемая через AJAX

def search_for_friends(request):
users = False
friends = False
return_page = 'users/friend_search.html'
ajax = 'ajax' in request.GET
try:
    if 'q' in request.GET:
        form = FriendSearchForm(request.GET)
        if form.is_valid():
            if form.cleaned_data['search_type'] == 'username':
                users = CustomUser.objects.exclude(pk=request.user.id).filter(username__icontains=form.cleaned_data['q'])
            elif form.cleaned_data['search_type'] == 'name':
                users = CustomUser.objects.filter(Q(first_name__icontains=form.cleaned_data['q']) | Q(last_name__icontains=form.cleaned_data['q']))
            elif form.cleaned_data['search_type'] == "email":
                users = CustomUser.objects.filter(email__icontains=form.cleaned_data['q'])
            else:
                pass
        else:
            pass
    else:
        form = FriendSearchForm()
    if users != False:
        users = users
        error = False
    if users == "":
        users = ""
        error = "No users match the search term provided"
    if ajax:
        show_results = True
        context = RequestContext(request,{'users':users,'form':form,'show_results':show_results})
        return render_to_response('users/friend_search_results.html',context_instance=context)
    context = RequestContext(request,{'users':users,'form':form,'error':error})
    return render_to_response(return_page,context_instance=context)
except:
    form = FriendSearchForm()
    context = RequestContext(request,{'form':form})
    return render_to_response(return_page,context_instance=context)

Ответы [ 3 ]

1 голос
/ 28 апреля 2011

Если вы не хотите иметь JavaScript в ответе AJAX, вы можете иметь событие завершения .load() взять на себя ответственность за настройку событий щелчка:

var url = "/search/friends/?ajax&q="+encodeURIComponent(q)+"&search_ty­pe="+encodeURIComponent(type);
$("#results").load(url, function() {
    var csrf_token = "{{ csrf_token }}";
    $(".user_link").bind('click',function() {
        request_friend($(this).id,csrf_token)
    });
});
1 голос
/ 28 апреля 2011

если я правильно понимаю ваш вопрос, вы хотите убедиться, что обработчики кликов работают для ссылок, загруженных с помощью более позднего вызова AJAX?

В jQuery используйте обработчик $('.user_link').live('click', function() {}) один раз, чтобы назначить обработчик события клика длявсе текущие и будущие ссылки.

0 голосов
/ 28 апреля 2011

Javascript, возвращаемый из вашего вызова AJAX, не будет оценен, если вы специально не скажете jQuery его оценить. Это можно сделать, указав dataType в ваших вызовах AJAX, который .load() не поддерживает .

Как видно из этого ответа , вы должны использовать jQuery.get() или $.ajax и указать тип данных:

$.ajax({
  type: "GET",
  url: "yourPage.htm",
  dataType: "html"
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...