0

Я новичок в использовании Django или даже создании веб-сайта, поэтому, пожалуйста, несите меня, если я предоставил слишком мало/подробно о проблеме, с которой я сталкиваюсь. Кроме того, я потратил большую часть прошлой недели троллинг SO-страниц, блогов, учебников Django, документации Django и т. Д., Пытаясь решить проблему самостоятельно. Возможно, я что-то упустил, или мне просто не повезло, но ничего, что я нашел, не затрагивает мою конкретную ситуацию во всей ее полноте. Большинство примеров, похоже, сосредоточены на обработке запросов в views.py, а не на том, как выполняется первоначальный запрос в шаблоне Django.Выполнение запроса шаблона django html с несколькими ключевыми значениями

У меня есть шаблон Django, view_table.html, который отображает объект таблицы BootTrap DataTable для пользователя. Второй столбец этой таблицы - BigIntegerField, называемый MyRow_ID. Я в настоящее время имеет код в MyCode.js, что позволяет пользователю выделить несколько строк, и при нажатии кнопки modify_button щелчка по MyRow_ID значения для выбранных строк (например, [2, 13, 14]) фиксируются в JS dict под названием sent_data. После того, как эти значения были захвачены, я хотел бы получить modify_button, чтобы создать запрос GET, который отправит sent_data вместе с ним. После согласования в urls.py и вызывая modify_data функцию в views.py, modify_data должны оказывать новую страницу modify_table.html при переходе обратно экземпляров модели, соответствующие MyRow_ID для того, чтобы отобразить только данные выбранных строк. Я думаю, что я очень близко, и, возможно, только твик в регулярное выражение, что мне нужно, но вот мои вопросы:

  1. Как создать запрос GET в шаблоне Django view_table.html который проходит sent_data дальше к Django? В настоящее время я использую форму с методом и действия атрибуты, установленные в "GET" и "{% URL 'modify_data' sent_data = sent_data%}" соответственно. Я предполагаю, что GET, а не POST, должен использоваться, потому что запрос не модифицирует бэкэнд, это скорее тип запроса «фильтровать вид». Это правильное предположение? Как выглядит запрошенный url? Скажем Значения MyRow_ID [2,13,14]. Будет ли запрос получения выглядеть примерно так: /modify_data/matched_row_1 = 2 & matched_row_2 = 13 & matched_row_3 = 14? Должен ли я сам создать эту строку url в шаблоне, итерации по sent_data и прикрепления строки «matched_row_n =» или есть простой способ для шаблона создать это автоматически в запросе?
  2. Что правильный шаблон регулярного выражения, которые должны быть использованы в MyApp/urls.py, учитывая sent_data может быть от 1 до п уникального MyRow_ID значения, при условии, от 1 до п строк выбираются соответственно? (Очевидно, что надежный код будет включать обработку, в которой выбраны 0 строк, и нажата кнопка modify_button, но давайте отложим это на время.) В настоящее время я получаю ошибку NoReverseMatch в/myapp/view_data /: Обратный для 'modify_data' с аргументами '()' и аргументами ключевого слова '{u'sent_data': ''} 'не найден. Я новичок в использовании регулярного выражения, и я знаю, что у меня есть в . Myapp/urls.py неправ.
  3. Является ли код myapp/views.py правильно фильтровать соответствующие экземпляры модели и визуализировать modify_table.html с выбранными строками?

view_table.html:

<!DOCTYPE html> 
<html> 
    <head> 
    ## Bunch of code… ## 
    </head> 
    <body> 
    <div class="col col-xs-12 text-right"> 
     <form style="display" method="get" action="{% url 'modify_data' sent_data=sent_data %}"> 
     <button id="modify_button" type="button" class="btn btn-primary btn-create">Modify Data</button> 
     </form> 
    </div> 
    <br><br><br> 
    <table id="my_table"> 
     ## Code that displays my_table ## 
    </table> 
    <!-- Execute JS scripts --> 
    <script type="text/javascript" src="{% static "myapp/js/jquery-1.12.0.min.js" %}"></script> 
    <script type="text/javascript" src="{% static "myapp/js/jquery.dataTables.min.js" %}"></script> 
    <script type="text/javascript" src="{% static "myapp/js/bootstrap.min.js" %}"></script> 
    <script type="text/javascript" src="{% static "myapp/js/dataTables.bootstrap.min.js" %}"></script> 
    <script type="text/javascript"> 
     var sent_data = []; 
    </script> 
    <script type="text/javascript" src="{% static "myapp/js/MyCode.js" %}"></script> 
    </body> 
</html> 

MyCode.js:

$(document).ready(function(){ 
    var oTable = $('#my_table').DataTable(); 
    var selected_data = []; 

    $('#my_table tbody').on('click','tr',function(){ 
    $(this).toggleClass('active'); 
    }); 

    $('#modify_button').click(function(event){ 
    selected_data = $.map(oTable.rows('.active').data(), function (item) { 
     return item[1] 
    }); 
    sent_data = { 'modify_rows': selected_data }; 
    }); 
}); 

Я должен отметить, что я использую MyRow_ID и не родной DataTable атрибут rowID, потому что я предполагаю автоматизацию DataTable tically-created rowID не соответствуют автоматически созданным основным ключам (pk), которые использует Django. Это правильное предположение?

MyApp/urls.py:

from django.conf.urls import url 
from . import views 
from .models import MyDataModel 

urlpatterns = [ 
       url(r'^view_data/$', views.view_data, name='view_data'), 
       url(r'^modify_data/(?P<sent_data>\d+)/$', views.modify_data, name='modify_data'), 
       ] 

MyApp/views.py:

from django.forms import modelformset_factory 
from django.shortcuts import render 
from django.http import HttpResponse 
from .models import MyDataModel 

def view_data(request): 
    myData = MyDataModel.objects.all() 
    return render(request, 'myapp/view_table.html', {'myData': myData}) 

def modify_data(request, sent_data): 
    MyDataFormSet = modelformset_factory(MyDataModel, fields=('MyRow_ID','MyRow_Text')) 
    if request.method == 'GET': 
    selected_rows = sent_data['modify_rows'] 
    ## selected_rows = request.GET['modify_rows'] 
    formset = MyDataFormSet(queryset=MyDataModel.objects.filter(MyRow_ID__in=selected_rows)) 
    selected_data = MyDataModel.objects.filter(MyRow_ID__in=selected_rows) 
    return render(request, 'myapp/modify_data.html', {'formset': formset, 'selected_data': selected_data}) 
    else: 
    return HttpResponse('A GET request was not received.') 

Наконец, modify_data.html:

<!DOCTYPE html> 
<html> 
    <head> 
    ## Bunch of code… ## 
    </head> 
    <body> 
    <div class="col col-xs-12 text-right"> 
     <form method="post" action=""> 
     {% csrf_token %} 
     {{ formset }} 
     <button id="submit_changes" type="button" class="btn btn-primary btn-create">Submit Changes</button> 
     </form> 
    </div> 
    <br><br><br> 
    <table id="selected_rows_table"> 
     ## Code that displays selected rows passed as selected_data ## 
    </table> 
    </body> 
</html> 

Любая помощь очень ценится, спасибо заранее!

ответ

0

Через много проб и ошибок и хороший старомодный googling я смог решить вышеупомянутые проблемы и получить лучшее понимание строк запроса, шаблонов регулярных выражений и даже как использовать запрос AJAX для достижения моей первоначальной цели.

Моя первоначальная цель состояла в том, чтобы разрешить пользователю выбирать несколько строк данных, щелкнуть по кнопке, а затем редактировать их одновременно в форме, указанная форма либо отображается на новой странице, либо в модальном виде.Следующие сообщения/блоги были очень полезны для каждой части головоломки:

Джанго документации по URL, запрос/ответ и модели FormSets:

https://docs.djangoproject.com/en/1.10/topics/http/urls/

https://docs.djangoproject.com/en/1.10/ref/request-response/

https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/#model-formsets

Руководство по созданию меток Bootstrap:

https://coolestguidesontheplanet.com/bootstrap/modal.php

Понимание того, как адрес и строка запроса работать с несколькими значениями для одного ключа:

http://meyerweb.com/eric/tools/dencoder/ (для тестирования)

How to pass multiple values for a single URL parameter?

Capturing url parameters in request.GET

Пример использования Django AJAX формы :

http://schinckel.net/2013/06/13/django-ajax-forms/

код для обработки ответа от сервера-запроса AJAX и обновления страницы:

Update div with jQuery ajax response html

Одна важная вещь, чтобы отметить об использовании строки запроса с несколькими значениями для одного ключа, например скажем, адрес моего запроса GET - это что-то вроде www.myurl.com/?page=1 & страница = 2 & страница = 3; при использовании запроса AJAX GET он создаст строку запроса для этого URL-адреса с www.myurl.com/?page[]=1 & страница [] = 2 & страница [] = 3, то есть добавляет «[ ] "для любой клавиши с несколькими значениями. Обычные ответы (как описано в Django и др.) Для извлечения всех значений ключа «page» в views.py при обработке запроса - использовать request.GET.getlist ('page'). ЭТО НЕ БУДЕТ РАБОТАТЬ. Вам нужно использовать request.GET.getlist ('page []'). Добавьте скобки в request.method.getlist() или удалите их из исходной строки запроса в запрошенном URL-адресе.

Наконец, вот некоторые фрагменты модифицированного кода, который обратился мои оригинальные вопросы:

In view_data.html, обновленном виде:

<form id="modify_form" method="post" action="{% url 'modify_data' %}"> 
    {% csrf_token %} 
    {{ formset }} 
</form> 

В MyApp/urls.py, фиксированные URL-адрес для обработки любой строки запроса:

url(r'^modify_data/$', views.modify_data, name='modify_data'), 

myapp/views.ру, изменить modify_data кода:

def modify_data(request): 
    MyDataFormSet = modelformset_factory(MyDataModel, fields=('MyRow_ID','MyRow_Text')) 
    if request.is_ajax(): 
    template = 'myapp/view_data.html' 
    else: 
    template = 'myapp/modify_data.html' 

    if request.method == 'GET': 
    selected_rows = request.GET.getlist['modify_rows[]'] 
    formset = MyDataFormSet(queryset=MyDataModel.objects.filter(MyRow_ID__in=selected_rows)) 
    selected_data = MyDataModel.objects.filter(MyRow_ID__in=selected_rows) 
    return render(request, template, {'formset': formset, 'selected_data': selected_data}) 
    else: 
    return HttpResponse('A GET request was not received.') 

В MyCode.js, код был обновлен, чтобы отразить с помощью модальной формы, AJAX GET запроса и обновив DOM с ответом Джанго view.py в:

$("#modify_button").click(function(){ 
    selected_data = $.map(oTable.rows('.active').data(), function (item) { 
    return item[1] 
    }); 

    $.ajax({ 
    // The URL for the request 
    url: URL, 

    // The data to send (will be converted to a query string) 
    data: { 
     modify_rows: selected_data, 
    }, 

    // Whether this is a POST or GET request 
    type: "GET", 
    }) 
    // Code to run if the request succeeds (is done); 
    // The response is passed to the function 
    .done(function(json) { 
     var forms_result = $('<div />').append(json).find('#modify_form').html(); 
     $('#modify_form').html(forms_result); 
     var table_result = $('<div />').append(json).find('#my_table').html(); 
     $('#my_table').html(table_result); 
    }) 
    // Code to run if the request fails; the raw request 
    // and status codes are passed to the function 
    .fail(function(xhr, status, errorThrown) { 
     alert("Sorry, there was a problem!"); 
     console.log("Error: " + errorThrown); 
     console.log("Status: " + status); 
     console.dir(xhr); 
    }) 
}); 

Надеюсь, все это несколько полезно для кого-то другого, если нет, весь этот процесс стал для меня отличным опытом обучения!

 Смежные вопросы

  • Нет связанных вопросов^_^