2014-03-31 48 views
0

我有以下forms.py与单选按钮和其中的其他领域。基于单选按钮的选择,我应该启用或禁用表单中的其他字段。django中的单选按钮选择功能表格

Forms.py

class SampleForm(forms.ModelForm): 
     option = forms.TypedChoiceField(choices=BoolChoices, widget=forms.RadioSelect(renderer=HorizontalRadioRenderer,attrs={'onchange':'check_status()'}), coerce=int,) 
     otherFields = forms.IntegerField(
      widget=forms.TextInput(attrs={'size': 7, 'disabled':True})) 
     ..... 
     ..... 
     class Meta: 
     model = Sample 
     class Media: 
      js = ('checkoption.js'), 

我的问题是我应该使用模板(扩展管理/ base_site.html)或者只是添加模板目录下的myapp /模板/ MYAPP/template.html

在这种情况下,如果我使用以下template.html和views.py中

<form action="{% url myapp.views.check_option %}" method="POST">{% csrf_token %} 
{{ form_as_p }} 
<input id="submit" type="button" value="Click" /> 

def check_option(request): 
if request.method == 'GET': 
    form = SsmpleForm() 
else: 
    form = SampleForm(request.POST) 

if form.is_valid(): 
    opt = form.cleaned_data['option'] 
    if opt == 1: 
     form.fields['otherFields'].widget.attrs['enabled'] = True 
return render_to_response('verinc/template.html', {'form' : form,},context_instance=RequestContext(request)) 

现在如何将无线电选择映射到这个视图?有没有其他的解决方案来设计这个任务在Django中。

尝试与阿贾克斯

$(document).ready(function(){ 
function check_status(){ 
    $.get("{% url myapp.views.check_option %}", function(data){ 
     console.log(data); 
} 
} 
})(django.jQuery); 
+0

你是什么意思由'如何*映射*无线电选择到这个视图?' –

+0

我的意思是,当单击一个单选按钮时调用在视图中定义的函数check_option() – Ria

+0

'check_option'是视图。它会在您提交表单时执行。 –

回答

0

尝试看一看我给另一个问题的答案:How to render django form differently based on what user selects?

它处理了同样的情况,而是chcekboxes它是一个下拉菜单。但那真的是无关紧要的。

的一点是:

的观点应该定义窗体的行为,而不是模板和JavaScript,它只能用于修改的东西都已经“允许”的观点。

否则恶意用户可能会使字段可见并在未经您的同意的情况下对其进行编辑,这可能会导致无法预料的结果。

但是您将能够获得正确的行为,因为表单将使用已给定的输入进行重新填充。

您可以使用AJAX获得一些无缝行为,但过程将保持不变:SUbmit Form - > Call View - > Return rendered output。唯一不同的是,您将替换内联表单而不是重新加载整个HTML页面。