2016-08-04 67 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()时,你已经拥有了新的日期值。之后,使对应的方法在get_name views.py

像这样的ajax调用url

$(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_nameflights数据,那么您可以直接发送serialzed datadataajax属性中的表格。

注意 - >你必须从你的get_name视图返回HttpResponse作为Ajax调用需要一个的HttpResponse从后端到成功完成Ajax调用。您可以简单地在响应中返回一个字符串。

+0

非常感谢!我会尝试=) –

+0

原生django的方式呢?我搜索了一下,可能会将__init__类添加到表单中以获得类似的功能,请问关于此问题的建议? –

+0

** **覆盖**'init'函数在后端实现** dynamic django forms **。根据我的理解,他们会工作说,例如,你有一个django的形式来进入足球运动员的信息。但是如果玩家的角色是前锋,那么你可以在前端使用Javascript动态地添加额外的字段,并且当数据被提交时,动态字段被添加到django FORM中(当你已经在'init'函数中定义时你会覆盖它)。但是,他是否是前锋的初始信号会被JS检测到,然后ajax会告诉Django。 –