2015-05-29 3 views
0

Я два формы режима поля: action и service:Джанго модель формы зависимости изменения

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'})} 

Тогда я взять АЯКС запрос пост на изменение первого поля:

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

Как можно найти параметры id_second_select с .find()? если раньше я передавал этот кортеж: ('wisdom.fun', 'wisdom.fun'), могу ли я показать его, вызвав secondSelectOptions.find ('wisdom.wisdom'). show()? –

+0

Извините - моя вина. Я изменил его, чтобы использовать '.filter' – Brandon

+0

Но даже' secondSelectOptions.filter ('wisdom.wisdom'). Show() 'просто скрывает это поле выбора. –

Смежные вопросы