Я два формы режима поля: 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 заранее.
Django ожидает, что выбор для поля будет определен при создании экземпляра формы. Если вы измените выбор на стороне клиента через ajax, но не на стороне сервера, ваша форма не будет иметь допустимых вариантов. Моя рекомендация заключалась бы в том, чтобы установить все доступные варианты во втором выборе и просто фильтровать видимость выбора с первого выбора. – Brandon
Это также имеет приятный побочный эффект от необходимости делать дополнительные вызовы на сервере и быть более быстрым для пользователя в целом. – Brandon
@Brandon, как можно фильтровать видимость? –