Python django表单中的单选按钮选择功能
我有以下带有radiobutton和其他字段的forms.py。根据单选按钮的选择,我应该启用或禁用表单中的其他字段 Forms.pyPython django表单中的单选按钮选择功能,python,django,Python,Django,我有以下带有radiobutton和其他字段的forms.py。根据单选按钮的选择,我应该启用或禁用表单中的其他字段 Forms.py class SampleForm(forms.ModelForm): option = forms.TypedChoiceField(choices=BoolChoices, widget=forms.RadioSelect(renderer=HorizontalRadioRenderer,attrs={'onchange':'check_statu
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'),
我的问题是我应该使用模板(扩展admin/base_site.html)还是只在myapp/templates/myapp/template.html下添加templates dir
在这种情况下,如果我使用以下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" />
现在,如何将收音机选择映射到此视图?在django中设计此任务是否有其他解决方案
尝试使用Ajax
$(document).ready(function(){
function check_status(){
$.get("{% url myapp.views.check_option %}", function(data){
console.log(data);
}
}
})(django.jQuery);
看看我对另一个问题的回答: 它处理相同的情况,但它不是chcekboxes,而是一个下拉菜单。但那真的无关紧要 重点是: 视图应该定义表单的行为,而不是模板或javascript,后者应该只用于修改视图已经“允许”的内容 否则,恶意用户可能会使字段可见,并在未经您同意的情况下对其进行编辑,这可能会导致不可靠的结果 但是您将能够获得正确的行为,因为表单将使用已经给定的输入重新填充
您可以使用AJAX获得一些无缝的行为,但过程将保持不变:提交表单->调用视图->返回渲染输出。唯一不同的是,您将以内联方式替换表单,而不是重新加载整个html页面 您希望在呈现表单的模板文件中有类似的内容:
<script>
window.onload = function() {
// Initial display based on default message_type 1
document.getElementById("id_title").style['display'] = 'block';
document.getElementById("id_body").style['display'] = 'block';
document.getElementById("id_data").style['display'] = 'none';
// Get the radio input elements
message_types = document.getElementsByName("message_type");
message_types.forEach(function(message_type) {
message_type.addEventListener("change", function() {
if (message_type.value == 1) {
document.getElementById("id_title").style['display'] = 'block';
document.getElementById("id_body").style['display'] = 'block';
document.getElementById("id_data").style['display'] = 'none';
} else {
document.getElementById("id_title").style['display'] = 'none';
document.getElementById("id_body").style['display'] = 'none';
document.getElementById("id_data").style['display'] = 'block';
}
});
});
}
</script>
window.onload=函数(){
//基于默认消息类型1的初始显示
document.getElementById(“id_title”).style['display']='block';
document.getElementById(“id_body”).style['display']='block';
document.getElementById(“id_数据”).style['display']='none';
//获取无线电输入元素
消息类型=document.getElementsByName(“消息类型”);
消息类型。forEach(函数(消息类型){
消息类型。addEventListener(“更改”,函数(){
如果(消息类型值==1){
document.getElementById(“id_title”).style['display']='block';
document.getElementById(“id_body”).style['display']='block';
document.getElementById(“id_数据”).style['display']='none';
}否则{
document.getElementById(“id_title”).style['display']='none';
document.getElementById(“id_body”).style['display']='none';
document.getElementById(“id_数据”).style['display']='block';
}
});
});
}
请注意,Django在表单定义中给出的名称前面加上“id_”前缀,以创建元素的id。本例中的表单类包含名为title、body和data的字段。在您的示例中,可能是
id_option
和id_otherFields
,等等。您所说的如何*映射*单选选项到此视图是什么意思?
我的意思是,单击单选按钮check_option
时调用view check_option()中定义的函数就是视图。当您提交表单时,它将被执行。好的。。但是,我需要运行单选按钮单击选项的功能。这可能吗?然后您需要一个AJAX视图,可以在单选按钮字段更改时调用该视图。但这种观点也应该做出同样的反应。您的视图正在直接呈现模板。如果单击单选按钮时发送表单的一小部分,它将返回什么?
<script>
window.onload = function() {
// Initial display based on default message_type 1
document.getElementById("id_title").style['display'] = 'block';
document.getElementById("id_body").style['display'] = 'block';
document.getElementById("id_data").style['display'] = 'none';
// Get the radio input elements
message_types = document.getElementsByName("message_type");
message_types.forEach(function(message_type) {
message_type.addEventListener("change", function() {
if (message_type.value == 1) {
document.getElementById("id_title").style['display'] = 'block';
document.getElementById("id_body").style['display'] = 'block';
document.getElementById("id_data").style['display'] = 'none';
} else {
document.getElementById("id_title").style['display'] = 'none';
document.getElementById("id_body").style['display'] = 'none';
document.getElementById("id_data").style['display'] = 'block';
}
});
});
}
</script>