Как я могу запустить функцию Django при нажатии кнопки, которая не отображает содержимое?
Я неплохо справляюсь с Django & Python, только что заработала функция поиска. Но я не уверен в своей следующей проблеме.
У меня есть функция, которая подключается к Amazon S3 и сохраняет ключи в моей базе данных. В настоящее время я запускаю это, когда страница визуализируется, но я хочу, чтобы у меня была кнопка, которая запускает этот вызов, чтобы он был похож на кнопку обновления, чтобы обновить базу данных с последним содержимым.
Действие по поиску переходит в /search/ , поэтому urls заботится о том, чтобы дать шаблон и просмотр для запуска кода поиска. Но если моя форма обновления имеет действие=".- а если изменить страницу, как вы укажете на ее функцию? (Я использую общие представления)
Вероятно, было бы неплохо вывести результаты из функции на экран, но сначала я просто хочу понять, как вы вызываете функцию, которая не обязательно показывает пользователю что-либо.
Моя функция довольно проста (и да, я добавил этот первый оператор 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 и размещать запросы на каждой странице загрузки. Если это так, то почему индексное представление не возвращает updateRevFromS3()?
2 ответов:
Если вы используете обычную форму POST, страница будет перезагружена - именно так работает HTTP. Чтобы иметь "фоновый" пост, вам нужно использовать 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 обеспеченный скрытым входом присутствует):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()
Если вы не хотите перезагружать страницу, самый простой способ сделать это-иметь некоторый JavaScript, который выполняет запрос HTTP для вас. Взгляните на jquery, это библиотека JS, которая делает такие вещи легким ветерком.
Comments