Как запустить функцию Django при нажатии кнопки, которая не отображает содержимое? - PullRequest
3 голосов
/ 16 марта 2012

Я неплохо справляюсь с Django & Python, только что заработала функция поиска. Но я не уверен в своей следующей проблеме.

У меня есть функция, которая подключается к Amazon S3 и сохраняет ключи в моей базе данных. В настоящее время я запускаю это при отображении страницы, но мне нужна кнопка, которая выполняет этот вызов, так что это будет похоже на кнопку обновления для обновления базы данных самым последним содержимым.

Действие по поиску переходит к /search/, поэтому URL-адреса позаботятся о том, чтобы предоставить этот шаблон и представление для запуска поискового кода. Но если моя форма обновления имеет действие = "." и должны изменить страницу, как вы указываете на функцию? (Я использую общие представления)

Вероятно, было бы неплохо отобразить результаты функции на экране, но сначала я просто хочу понять, как вы вызываете функцию, которая не обязательно показывает пользователю что-либо.

Моя функция довольно проста (и да, я сначала добавил это выражение if, когда пытаюсь это реализовать):

def updateRevFromS3(request):
    if ('r' in request.POST) and request.POST['r'].stript():
        s3 = boto.connect_s3(
            settings.AWS_ACCESS_KEY_ID,
            settings.AWS_SECRET_ACCESS_KEY)  # Connect to Amazon S3
        b = s3.get_bucket(
            settings.AWS_STORAGE_BUCKET_NAME)  # Find existing bucket to store data
        revision = b.list(prefix="{{ update_revision }}")

        for key in revision:
            # download values to db
            try:
                obj = screenshots.objects.get(imgUrl=key.name,
                                              mod_date=key.last_modified)
            except screenshots.DoesNotExist:
                obj = screenshots(imgUrl=key.name,
                                  meta=key.metadata,
                                  mod_date=key.last_modified)
                obj.save()
                print "Saving: " + key.name
            else:
                print key.name + " already exists."

И моя форма:

<form action="." method="get" id="updateForm">{% csrf_token %}
   <label>Update images for revision:</label><br/>
   <input type="text" name="r" value="{{ update_revision|escape }}"/> 
   <input type="submit" value="Update" />
</form>

Следующим шагом будет предоставление пользователю обратной связи в результате, но я вернусь к этому после того, как смогу вызвать функцию! Спасибо:)

обновление

Я добавил jQ, чтобы поймать форму обновления (я поставил предупреждение, чтобы проверить это);

<script type="text/javascript">
    $("#updateForm").bind("submit", function () {
        $.post(ajax_url, {r: $(this).find('[name="r"]').val()}, function (data) {
            // nothing here for now, but this is where you could update the UI, etc. 
        });
        return false;
    });
</script>

И мой вид по умолчанию выглядит следующим образом (это всегда падает до окончательного возврата);

def index(request):
    if request.is_ajax():
        print "is ajax"
        return updateRevFromS3(request)
    elif request.POST.get('r') == "updateForm":
        print "is post"
        return updateRevFromS3(request)
    print "not ajax or post"
    return render_to_response("base.html", RequestContext(request))

Как будто я не представляю, что я на самом деле делаю с этим, я не уверен, почему мое окно консоли показывает запросы GET и POST при каждой загрузке страницы. Если это так, почему индексное представление не возвращает updateRevFromS3()?

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Если вы используете обычную форму POST, страница перезагрузится - так работает HTTP.Чтобы иметь «фоновый» POST, вам нужно использовать AJAX.Если на вашей странице есть jQuery, вам нужно добавить идентификатор в форму, чтобы его можно было легко выбрать, а затем выполните что-то вроде этого:

$("#formid").bind("submit", function(){
    $.post(ajax_url, {r: $(this).find('[name="r"]').val()}, function(data){
        // nothing here for now, but this is where you could update the UI, etc.
    });
    return false;
});

Вот соответствующие документы jQuery.

По вашему мнению, вы можете условно передать функцию обновления на основе request.is_ajax() (или любого другого условия, скажем, присутствует ли конкретный ключ POST, предоставленный скрытым вводом):1009 *

def your_view(request):
    if request.is_ajax(): return updateRevFromS3(request)
    elif request.POST.get("my-hidden-input-name") == "this-is-the-update-form":
        return updateRevFromS3(request)
    return normal_processing()
1 голос
/ 16 марта 2012

Если вы не хотите, чтобы страница была перезагружена, самый простой способ сделать это - использовать JavaScript, который выполняет HTTP-запрос для вас.Взгляните на jquery , это библиотека JS, которая делает такие вещи легкими.

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