Так что этот вид более подробно раскрывает то, что предложил @Nathan.
Возьми один
Во-первых, вы можете опубликовать форму подписки в каждом шаблоне, где, по вашему мнению, пользователь щелкнет ссылку подписки на рассылку. Форма скрыта и будет представлена, когда наложение вызовет ее отображение.
{# newsletter_subscribe_request_form_overlay.html #}
{% if newsletter_subscribe_request_form %}
<div id="newsletter_subscribe_request_form_overlay" class="simple_overlay">
<form action="{% url newsletter_subscribe_request %}" method="POST">
{{ newsletter_subscribe_request_form.as_p }}
<input type="submit" value="Subscribe to the newsletter" />
{% csrf_token %}
</form>
</div>
{% endif %}
{# now, in the templates where the overlay action link will be present #}
{# ...at the very bottom, just before the `BODY` element closing tag #}
{% include 'newsletter_subscribe_request_form_overlay.html' %}
Хорошо, так что это позволит вам разместить скрытую форму подписки на любой странице, где вы хотели бы представить ее с наложением. Теперь осталось добавить newsletter_subscribe_request_form
в контекст шаблона. Вы можете сделать это, либо обновив представления, чтобы добавить форму в контекст, либо создать контекстный процессор. Лично я бы предпочел контекстный процессор:
from newsletter.models import Subscription
from newsletter.forms import SubscribeRequestForm
def newsletter_subscribe_request_form_overlay(request):
'''
Inserts a newsletter subscribe request form into the context
for every user that's not yet subscribed.
'''
try:
Subscription.objects.get(user=request.user)
# object exists, user is already subscribed
return {}
except Subscription.DoesNotExist:
# object doesn't exist, push the form to the context
return {'newsletter_subscribe_request_form': SubscribeRequestForm()}
except:
# something unexpected happened, or I messed up
return {}
Так что насчет этого подхода. Этот довольно простой, так как он включает в себя только написание простого шаблона, включение его в другие шаблоны и последующее использование контекстного процессора, который помещает форму в контекст шаблона для неподписанных пользователей.
Обратной стороной является то, что, в зависимости от вашей команды или личных предпочтений, это может быть слишком много волшебства, чтобы справиться. Если вы не документируете подход где-то, будет немного не интуитивно понятно, откуда взялся newsletter_subscribe_request_form
в контексте (представление ?; один из процессоров контекста?), И вам, возможно, придется пройти через большую строку наследования выяснить, где newsletter_subscribe_request_form_overlay.html
был включен. Не говоря уже о том, что вы выполняете дополнительный запрос к базе данных за запрос.
Однако для этого очень важно то, что вы также можете добавить форму отказа от подписки в контекст, если пользователь подписан, и в зависимости от того, какой из этих двух параметров присутствует, вы можете динамически изменять заголовки ссылок между «Подписаться» и «Отписаться», что будет одним из тех маленьких благ, которые вы можете дать своим пользователям.
Возьми два
Второй подход заключается в создании простого CreateView
, который можно получить с помощью вызова Ajax и представить содержимое в оверлее в интерактивном режиме.
from django.views.generic.edit import CreateView
from newsletter.forms import SubscribeRequestForm
from django.http import HttpResponseBadRequest
class AjaxSubscriptionRequestView(CreateView):
''''
A simple subscription create view that returns a
subscription form in the response for Ajax calls
''''
http_method_names = ['get',]
form_class = SubscribeRequestForm
template_name = 'newsletter_subscribe_request_form_overlay.html'
def get_initial(self):
return {'user': self.request.user}
def get(self, request, *args, **kwargs):
if not request.is_ajax():
return HttpResponseBadRequest()
else:
return super(AjaxSubscriptionRequestView, self).get(request,
*args, **kwargs)
Итак, мы используем тот же шаблон, что и в первом примере, поэтому мы просто возвращаем форму в ответе. Теперь это просто вопрос выбора формы и представления ее в оверлее после ее получения.
<script type="text/javascript">
function newsletterSubscribeRequestFormOverlay(eventObject) {
eventObject.preventDefault();
$.ajax({
url: "{% url ajax-subscription-request %}",
cache: false,
success: function(html){
$('body').append(html);
$('.simple_overlay').overlay();
}
});
}
</script>
<a href="{% url newsletter_subscribe_request %}"
onclick="javascript: newsletterSubscribeRequestFormOverlay(event);">
Subscribe to our newsletter
</a>
Конечно, для этого потребуется дополнительная слюна и полировка. Вы можете представить оверлей со счетчиком, пока не получите ответ с формой HTML, чтобы предоставить пользователям некоторую форму обратной связи, когда они нажимают на ссылку подписки.