【问题标题】:Django model form dependency modifyingDjango模型表单依赖修改
【发布时间】:2015-05-29 11:13:28
【问题描述】:

我有两个模式表单字段:actionservice

class InputsModelExtended(models.Model):
    service = models.CharField(max_length=1000, choices=SERVICE_CHOICES, blank=True)
    action = models.CharField(max_length=1000, choices=ACTION_CHOICES, blank=True)
    def __str__(self):      
        return self.input   
    class Meta:
       ordering = ["service"]
       unique_together = ('service', 'action')

我将它们传递给form.py 并创建了模型表单:

class InputsModelExtendedForm(ModelForm):
class Meta:
    model = InputsModelExtended
    #fields = ['service', 'action', 'input']
    fields = '__all__'
    widgets = {'service': forms.fields.Select(attrs={'class': 'service_select_box'}), 'input': forms.fields.TextInput(attrs={'placeholder': 'Enter an input', 'class': 'selectpicker'}), 'object': forms.fields.TextInput(attrs={'placeholder': 'Enter an object', 'class': 'selectpicker'})}

然后我在更改第一个字段时接受 ajax 发布请求:

$(document).ready(function() {
    var select_box = $('.service_select_box')
    select_box.on('change', function(e) {
        console.log('event ', select_box.val());
        data = { "csrfmiddlewaretoken": '{{ csrf_token }}', 'action': select_box.val()};
        $.ajax({
            url: "/ajaxrequest",
            type: "POST",
            data: data,
            success: function (data) {console.log('success', data);},
            error: function (data) {console.log('error', data);},
        });
    });
    return false;
});

现在我应该如何将action 字段变体调整为service 中选择的选项?我尝试通过ajax_text将其发布到模板:

def ajax_test(request):
choices = {'assistant app' : (('ask' : (('Choose action', 'Choose action',), ('ask.friends','ask.friends',)),
'wisdom' : (('Choose action', 'Choose action',), ('wisdom.wisdom', 'wisdom.wisdom'))}
if request.is_ajax() and request.POST['action']:
    action = request.POST['action']
    #message = "ur action is " + str(request.POST['action'])
    action_choices = choices[action.lower()]
else:
    message = "empty or not an ajax"
form = InputsModelExtendedForm(request.POST or None, action_choices=action_choices) #passing form to template
InputsAll = InputsModelExtended.objects.all() #passing all objects to template
return render(request, 'inputs_forms_css.html', {'form': form, 'InputsAll': InputsAll, 'id': id})

action 字段似乎不会在不刷新的情况下发生变化,尽管通过 ajax 成功响应我得到了正常的修改选择:

Service: <select class="service_select_box" id="id_service" name="service">
<option value="" selected="selected">---------</option>
<option value="Apps">Ask</option>
Action: <select id="id_action" name="action">
<option value="Choose action">Choose action</option>
<option value="ask.friends">ask.friends</option>

是否应该通过 jquery 修改第二个字段选择集,或者可以通过其他方式完成?提前谢谢。

【问题讨论】:

  • Django 期望在实例化表单时定义字段的选择。如果您通过 ajax 而不是服务器端更改客户端的选项,则您的表单将没有有效的选项。我的建议是在第二个选择中设置所有可用的选项,然后从第一个选择中过滤选项的可见性。
  • 这也有一个很好的副作用,即不必对服务器进行任何额外的调用,并且总体上应该是更快的用户体验。
  • @Brandon 如何过滤可见性?
  • 我会为第二个选择中的每个选项添加一个属性,该属性对应于第一个选择中的相关选项。它可以是 css 类、数据属性等。然后您可以通过 JavaScript 向第一个选择添加一个 on-change 处理程序,以隐藏第二个选择中不匹配的任何元素。
  • @Brandon 我将 .action_select_box 类分配给第二个字段。但是可以通过哪种jquery方法过滤这个字段? .html() ?

标签: jquery python ajax django forms


【解决方案1】:

首先,您需要在模板级别迭代第二个字段的选项,以添加您想要过滤的任何属性。在本例中,我们将根据第一个选择的值过滤第二个选择的选项。

var firstSelect = $('#id_first_select'),
    secondSelectOptions = $('#id_second_select option');

firstSelect.on('change', function(e) {
    var value = $(this).val();

    secondSelectOptions.hide();
    secondSelectOptions.filter('[data-related-value="' + value + '"]').show();
});

【讨论】:

  • 如何使用 .find() 找到 id_second_select 选项?如果之前我通过了这个元组:('wisdom.fun','wisdom.fun'),我可以通过调用 secondSelectOptions.find('wisdom.wisdom').show() 来显示它吗?
  • 对不起 - 我的错。我已将其更改为使用.filter
  • 但即使secondSelectOptions.filter('wisdom.wisdom').show() 也只是隐藏了这个选择框。
  • 我的示例过滤选项元素的data 属性。您需要调整您的代码以执行与我的示例类似的操作。
  • 感谢您的示例,我可以调整它,但我不完全理解如何以及使用哪个属性过滤器 django 选择表单。我不是在谈论获取一组值,而是针对一个定义的测试值。
猜你喜欢
  • 2012-03-23
  • 2018-01-31
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
相关资源
最近更新 更多