【问题标题】:function for radio button select in django Formsdjango Forms中单选按钮选择的功能
【发布时间】:2014-03-31 08:14:37
【问题描述】:

我有以下 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 下添加模板目录

在这种情况下,如果我使用以下 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 中设计此任务。

尝试使用 Ajax

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

【问题讨论】:

  • how to *map* radio selection to this view?是什么意思
  • 我的意思是,当单击单选按钮时调用视图 check_option() 中定义的函数
  • check_option 是视图。它会在您提交表单时执行。
  • 好的.. 但是我需要运行单选按钮单击选项的功能。这可能吗?
  • 然后你想要一个 AJAX 视图,你可以调用单选按钮字段的 onchange。但是,这种观点也应该做出同样的回应。您的视图直接呈现模板。如果您在单击单选按钮时将表单的一部分发送给它,它会返回什么?

标签: python django


【解决方案1】:

看看我对另一个问题的回答:How to render django form differently based on what user selects?

它处理相同的情况,但它不是 chcekboxes,而是一个下拉菜单。但这确实无关紧要。

重点是:

视图应该定义表单的行为,而不是模板或 javascript,它们只能用于修改视图已经“允许”的内容。

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

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

您可以使用 AJAX 获得一些无缝行为,但过程将保持不变:提交表单 -> 调用视图 -> 返回呈现的输出。唯一不同的是您将替换内联表单,而不是重新加载整个 html 页面。

【讨论】:

    【解决方案2】:

    您希望在呈现表单的模板文件中包含这样的内容:

    <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>
    

    请注意,Django 在表单定义中给定的名称前加上“id_”来创建元素的 id。此示例中的表单类包含名为 title、body 和 data 的字段。在您的示例中,它将是 id_optionid_otherFields 等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 2011-12-12
      • 1970-01-01
      • 2019-10-25
      相关资源
      最近更新 更多