2015-05-29 64 views
0

我有两个模式表单字段:actionserviceDjango的模型形式依赖修改

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 POST请求改变第一场:

$(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; 
}); 

现在我该怎么做djust 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修改或它可以做另一种方式? Thx提前。

+0

Django期望在表单实例化时定义字段的选择。如果您通过ajax更改客户端上的选项,而不是服务器端,则您的表单将不会有有效的选择。我的建议是设置第二个选择的所有可用选项,并仅从第一个选择中过滤选择的可见性。 – Brandon

+0

这也有很好的副作用,不必向服务器发出任何额外的呼叫,应该是一个更快的用户体验。 – Brandon

+0

@Brandon如何过滤可视性? –

回答

0

首先,您需要遍历模板级别第二个字段的选项,以添加想要过滤的属性。在这个例子中,我们将通过第一个选择的值来筛选第二个选择的选项。

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(); 
}); 
+0

如何使用.find()查找id_second_select选项?如果以前我通过这个元组:('wisdom.fun','wisdom.fun'),我可以通过调用secondSelectOptions.find('wisdom.wisdom')。show()来显示它吗? –

+0

对不起 - 我的错。我已经改变它使用'.filter' – Brandon

+0

但是即使'secondSelectOptions.filter('wisdom.wisdom')。show()'只是隐藏这个选择框。 –