half-life
@half-life

Как отловить данные и из формы и из ajax?

Есть форма с комментарием
form.py

class CommentForm(ModelForm):
    class Meta:
        model = Comment
        fields = [
            'content'
        ]
        widgets = {'content': w.Textarea(attrs={
            'cols': 80,
            'row': 5,
            'placeholder': 'Comment...',
        })}

есть вьюшка
views.py

class Comment(CreateView):
    form_class = CommentForm
    def form_valid(self, form):
        self.object = form.save(commit=False)
        user = get_object_or_404(UserModel, id=self.request.user.id)
        self.object.user = user
        self.object.article = self.get(request=self)
        self.object.save()
        return HttpResponseRedirect(self.get_success_url())

ещё есть темплейт
template.py

<div class="well">
        <form action="{% url "comment:comment_create" article.slug %}" method="post">
            {% csrf_token %}
            {{ form.as_p }}
            <input id="comment" type="submit" class="btn btn-primary" value="Submit">
        </form>
    </div>

и есть js
main.js

(function() {
  $(document).ready(function() {

    var csrfSafeMethod, csrftoken, getCookie, parentID, url;

    getCookie = function(name) {
      var cookie, cookieValue, cookies, i;
      cookieValue = null;
      if (document.cookie && document.cookie !== '') {
        cookies = document.cookie.split(';');
        i = 0;
        while (i < cookies.length) {
          cookie = jQuery.trim(cookies[i]);
          if (cookie.substring(0, name.length + 1) === name + '=') {
            cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
            break;
          }
          i++;
        }
      }
      return cookieValue;
    };

    csrftoken = getCookie('csrftoken');

    csrfSafeMethod = function(method) {
      return /^(GET|HEAD|OPTIONS|TRACE)$/.test(method);
    };

    parentID = null;
    url = window.location.pathname.replace(/\/\s*$/, '').split('/')[2];

    $('a:contains(Reply)').click(function() {
      return parentID = $(this).attr('data-parent');
    });

    return $('#comment').click(function() {
      if ((parentID != null) && parentID > 0) {
        console.log(parentID);
        return $.ajax({
          type: 'POST',
          url: "/comment/" + url + "/comment_create/",
          beforeSend: function(xhr, settings) {
            if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
              return xhr.setRequestHeader('X-CSRFToken', csrftoken);
            }
          },
          dataType: 'html',
          data: {
            'parentID': parentID
          },
        });
      }
    });
  });

}).call(this);


Подскажите как в form_valid передать parentID? на
if self.request.is_ajax(): не реагирует
Если доставать таким способом
self.request.POST["parentID"]
будет ошибка
error - django.utils.datastructures.MultiValueDictKeyError: "'parentID'"
что бы этого не было, надо делать так self.request.POST.get("parentID") но на выходе получается None потому, что в request.POST передаётся
<QueryDict: {'csrfmiddlewaretoken': ['zkuIhR6yen3k38bGmFKrLfC7jTaACl0N'], 'content': ['']}>
но не попадает parentID . ЧЯДНТ?
  • Вопрос задан
  • 509 просмотров
Решения вопроса 1
valerium
@valerium
Изобретая велосипед
Проблема в том, что POST запрос делается не из JavaScript, а самим браузером через форму. Очевидно, в таком случае в словаре self.request.POST нет ключа parentID.

Нужно или снять с кнопки #comment действие по умолчанию (тогда форма не будет обрабатываться, и запрос будет гарантированно отправлен с помощью AJAX), или добавить в форму скрытое поле, которое будет заполняться с помощью JavaScript или, если возможно, на сервере в шаблоне.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@ilov3
Учу питон и джангу потому что модно
self.request.POST["parentID"]
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы