2016-08-04 2 views
0

Я хотел бы создать динамическую систему ввода, например, когда я ввожу имя папки - список файлов внутри автоматически отображает другой вход ChoiceField ниже, поэтому я могу выбрать файл. Методы уже написаны, проблема в том, как я могу сделать это в представлении Django?Динамические входы Django

Вот мое мнение:

def get_name(request): 
    if request.method == 'POST': 
     form = NameForm(request.POST) 
     if form.is_valid(): 
      dir_date = format_date(request.POST['date']) 

      files = os.listdir(os.path.join(path+dir_date)) 
      return render(request, 'inform/show_name.html', {'data': request.POST['your_name'], 
                  'date': format_date(request.POST['date'])}) 
    else: 
     form = NameForm() 
    return render(request, 'inform/base.html', {'form': form}) 

Вот класс формы:

class NameForm(forms.Form): 
    your_name = forms.CharField(label='Your name', max_length=100) 
    date = forms.DateField(widget=forms.DateInput(attrs={'class': 'datepicker'})) 
    flights = forms.ChoiceField(choices=?) 

Наконец, вот мой шаблон.

{% extends 'inform/header.html' %} 
{% block content %} 
    <script> 
     $(function() { 
     $(".datepicker").datepicker(); 
     $("#anim").on("change", function() { 
      $("#datepicker").datepicker("option", "showAnim", $(this).val()); 
     }); 
     }); 
    </script> 
    <div class="container" style="color: red; size: auto;"> 
     <form class="form-vertical" action="get_name" role="form" method="post"> 
      {% csrf_token %} 
      <div class="form-group" style="display: inherit"> 
      <center> 
       {{form}} 
       <input type="submit" value="OK"> 
      </center> 
      </div> 
     </form> 
    </div> 
{% endblock %} 

Есть ли способ, чтобы динамически считывать данные из входного Дата и передать его методу внутри зрения, не нажимая кнопку отправки или создать несколько других? Если это можно решить только с помощью ajax, jQuery или JS, не могли бы вы дать мне простой пример того, как это делается? Я в значительной степени разочарован неспособностью создать простую форму.

Спасибо заранее!

+0

Да, это так. И вы поняли, что это можно решить, используя ajax. Я покажу вам короткий пример. –

ответ

0

Так что в основном вы делаете это правильно. Вы уже знаете, что вам нужна функция on(change) для datepicker

Теперь, как только пользователь меняет дату, срабатывает ваша функция on(change). Итак, все, что вам нужно сделать, это получить новое значение даты, которое у вас уже есть, когда вы делаете $(this).val(). После этого сделать ajax вызов к url, соответствующий вашему методу get_name в views.py

Что-то вроде этого:

$(function() { 
    $(".datepicker").datepicker(); 
    $("#anim").on("change", function() { 
     $("#datepicker").datepicker("option", "showAnim", $(this).val()); 
     send_changed_date_value(variable_with_new_date); 
    }); 
}); 

function send_changed_date_value(new_date) { 
    $.ajax({ 
     type: // "POST" or "GET", whichever you are using 
     url: "/url in urls.py corresponding to get_name method in views.py/", 
     data: new_date, 

     success: function(response){ 
      console.log("Success..!!") 
     } 
    }); 
} 

Это, как вы можете отправить новое значение даты вашего мнения, каждый раз это изменилось. Если вы хотите отправить данные полной формы, то есть your_name и flights данных, то вы можете напрямую отправить serialzed data формы в атрибуте dataajax.

Примечание -> Вам придется возвращать HttpResponse с вашего get_name зрения как Ajax вызов требует HttpResponse из внутреннего интерфейса для завершения вызова Ajax успешно. Вы можете просто вернуть строку в ответе.

+0

Большое спасибо! Я дам ему попробовать =) –

+0

А как насчет родного джанго? Я googled, что можно добавить класс __init__ в форму, чтобы получить аналогичную функциональность, не могли бы вы посоветоваться по этому вопросу? –

+0

По перестановке ** функция 'init' реализует ** динамические формы django ** в бэкэнд. По моему мнению, они будут работать, скажем, например, у вас есть форма джанго для входа в информацию о футболистах. Но если роль игрока является нападающим, то вы добавляете дополнительные поля во фронтмену, используя Javascript, динамически, и когда эти данные отправляются, динамические поля добавляются в эту ФОРМУ django (которую вы уже определили в функции 'init', когда вы его переопределили). Но исходный сигнал о том, был ли он нападающим, будет обнаружен JS, а затем ajax скажет то же самое Django. –

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