Я пытаюсь отображать размеры с помощью ajax, но он не отображается после успеха ajax

Вот сценарий ajax

<script type="text/javascript">
    function getStoreView(event, productId) {
        event.preventDefault();   
        var data = {
           productId : productId
        }
        // Send productId as query param of url
        $.ajax({        
            type: "GET",
            url: "{% url 'storeView'  user=store.user %}",
            data: data,
            success: function(data) {
              var html = "";
              $.each(data.sizes, function(index,sizes) { 
              console.log(sizes.value) 
            });
            },

            error: function(response, error) {
                alert(error);  
            }
        });
    };
</script>

Вот шаблон

    <form id="form" action="{% url 'storeView'  user=store.user %}" method="post"  />
                      {% csrf_token %}          

                      <div class="increment">
                      {% for size in sizes %}

                      <strong class="pull-left">{{size}}:</strong> 
                      <input type = "number" name="quantity" value="{{product.quantity}}">
                      <input type = "hidden" name = "size" value="{{size}}">
                      <input type = "hidden" name = "productid" value = "                              {{product.id}}">
                       {% endfor %}
                      </div>
                      <input type="submit" value="submit" id="submit"/>
                     </form>

Вот views.py

if request.user.is_authenticated():
        productid = request.GET.get('productId')
        if request.is_ajax():
            try:
                sizes = StoreProduct.objects.get_size(productid)
            except:
                sizes = None

            sizes = list(sizes.values())

            data = {
            "sizes" : sizes
            }

            return JsonResponse(data)

Я могу вести журнал размеров консоли, но как мне отобразить их в forloop?

На основе ответа Гибрида создается следующая обратная связь

File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\lenovo\Desktop\plump\Plumpin\src\store\views.py" in StoreView
  61.           return render(request , "store/storeform.html" , {'sizes' : sizes})
File "C:\Python27\lib\site-packages\django\shortcuts.py" in render
  67.             template_name, context, request=request, using=using)
File "C:\Python27\lib\site-packages\django\template\loader.py" in render_to_string
  99.         return template.render(context, request)
File "C:\Python27\lib\site-packages\django\template\backends\django.py" in render
  74.         return self.template.render(context)
File "C:\Python27\lib\site-packages\django\template\base.py" in render
  209.                     return self._render(context)
File "C:\Python27\lib\site-packages\django\template\base.py" in _render
  201.         return self.nodelist.render(context)
File "C:\Python27\lib\site-packages\django\template\base.py" in render
  903.                 bit = self.render_node(node, context)
File "C:\Python27\lib\site-packages\django\template\debug.py" in render_node
  79.             return node.render(context)
File "C:\Python27\lib\site-packages\django\template\defaulttags.py" in render
  507.                         six.reraise(*exc_info)
File "C:\Python27\lib\site-packages\django\template\defaulttags.py" in render
  493.             url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
File "C:\Python27\lib\site-packages\django\core\urlresolvers.py" in reverse
  579.     return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))
File "C:\Python27\lib\site-packages\django\core\urlresolvers.py" in _reverse_with_prefix
  496.                              (lookup_view_s, args, kwargs, len(patterns), patterns))

Exception Type: NoReverseMatch at /store/storeView/zara/
Exception Value: Reverse for 'storeView' with arguments '()' and keyword arguments '{u'user': ''}' not found. 2 pattern(s) tried: ['store/storeView/(?P<user>[\\w-]+)/$', 'store/storeView/(?P<user>[\\w-]+)/$']
0
asing177 22 Дек 2015 в 21:20

2 ответа

Лучший ответ

Итак, то, что вы пытаетесь сделать, требует от вас слияния ответа AJAX с циклом for, поэтому вам потребуется его обработка Django. Единственный способ сделать это - вернуть ответ render() вместо JSONResponse, а затем добавить его в свой html. Например:

Создайте новый HTML-файл с именем _store-form.html:

<form id="form" action="{% url 'storeView'  user=store.user %}" method="post"  />
                  {% csrf_token %}          

                  <div class="increment">
                  {% for size in sizes %}

                  <strong class="pull-left">{{size}}:</strong> 
                  <input type = "number" name="quantity" value="{{product.quantity}}">
                  <input type = "hidden" name = "size" value="{{size}}">
                  <input type = "hidden" name = "productid" value = "                              {{product.id}}">
                   {% endfor %}
                  </div>
                  <input type="submit" value="submit" id="submit"/>
</form>

В вашем views.py вместо последней строки return JsonResponse(data):

return render(request, '_store-form.html', {'sizes': sizes})

И теперь измените свой JS, чтобы добавить новый возвращенный html на вашу страницу:

<script type="text/javascript">
    function getStoreView(event, productId) {
        event.preventDefault();   
        var data = {
           productId : productId
        }
        // Send productId as query param of url
        $.ajax({        
            type: "GET",
            url: "{% url 'storeView'  user=store.user %}",
            data: data,
            success: function(data) {
              $('body').append(data);
            },

            error: function(response, error) {
                alert(error);  
            }
        });
    };
</script>
1
Hybrid 22 Дек 2015 в 18:50

Переменные шаблона Django передаются из views.py через контекст, а ajax извлекает значение откуда-то еще. Переменная шаблона Django и переменные javascript - это разные вещи, вы не можете ожидать, что они будут работать вместе. Для отображения формы вручную необходимо использовать javascript. Подробности см. В doc jquery.

0
Shang Wang 22 Дек 2015 в 18:25