Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django表单中的单选按钮选择功能_Python_Django - Fatal编程技术网

Python django表单中的单选按钮选择功能

Python 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

我有以下带有radiobutton和其他字段的forms.py。根据单选按钮的选择,我应该启用或禁用表单中的其他字段

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'),
我的问题是我应该使用模板(扩展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>