Может кто-нибудь поделиться универсальными примерами ajax для Django?

Изучаю Джанго, хочется сделать голосование на странице, чтобы результаты голосования показывались без перезагрузки страницы. При этом не хочется изучать js, да и вообще фронтэнд.

Есть ли у кого-нибудь готовый пример для получения данных из формы в представление, с отличным от текущего url? Выдачи в div шаблона с контекстом?

А если есть возможность, то можно на моем примере показать =)

template:
<div>
    <form id="photo_vote_form" action="{% url "vote" photo.id %}" method="post">
    {% csrf_token %}  {{ form.as_p }}
     <input type="hidden" name="next" value="{{ request.path }}" />
     <input type="submit" value="Отправить" />
     </form>
</div>

urls:
url(r'^$', FeedMainView.as_view(), name='feed'),
url(r'^(?P<pk>\d+)/vote/$', 'feed.views.vote', name= 'vote'),

views:
class FeedMainView(LoggedInMixin, TemplateView): 
    template_name = 'feed/base_feed.html'

    def get_context_data(self, **kwargs):
        context = super(FeedMainView, self).get_context_data(**kwargs)
        context["form"] = VoteForm()
        return context

def vote(request, pk):      
    photo = Photo_vote.objects.get(pk=pk)
    if request.method == 'POST':
            form = VoteForm(request.POST)
            if form.is_valid():
                  temp =form.save()
                  ...
                  return HttpResponseRedirect(photo.get_absolute_url())

    return http.HttpResponseRedirect(photo.get_absolute_url)
  • Вопрос задан
  • 3941 просмотр
Пригласить эксперта
Ответы на вопрос 1
crazyzubr
@crazyzubr
Python backend-developer
Если нужно что-то универсальное, то берется REST Framework, но, конечно же, нужно читать документацию по нему.

На моей практике обычно подобные скрипты пишутся каждый раз, как в первый раз) Зависит от проекта, конечно.

По идее в твоем коде нужно проделать минимум изменений.
Во-первых, нужно скорректировать вьюху, чтобы она отдавала json-данные. Тут можно выбрать способ из нескольких вариантов. Например, с class-based-views или заюзать декоратор render_to_json для обычной вьюхи из вспомогательного пакета handy.

В клиентской части совсем простой код получится, если иcпользовать популярный фреймворк JQuery, конечно же.
$('.vote').on('click', function(ev){
       ev.preventDefault();
       var $this = $(this);
        $.post($this.attr('data-url'))
         .success(function(data){
             if (data.error){
                 alert(data.error);
             }else if (data.voted){
                 alert('Спасибо за ваш голос!');
             }
         })
         .fail(function(){
             alert('Возникла ошибка. Попробуйте позже.');
         })
    });


Соответственно у ссылки должен быть указан атрибут data-url со ссылкой c ID для вьюхи vote.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы