Форум сайта python.su
4
Здравствуйте!
Мне нужно добавить данные из БД в списки формы. Сейчас значений немного и код работает:
# -*- coding: utf-8 -*-
from django import forms
from .models import City
class OrderForm(forms.Form):
cities = City.objects.all()
list_cities = [(i, i) for i in cities]
src_city = forms.ChoiceField(label='Город отправки:', widget=forms.Select, choices=list_cities)
dest_city = forms.ChoiceField(label='Город приема:', widget=forms.Select, choices=list_cities)
# -*- coding: utf-8 -*-
from django import forms
from .models import City
class OrderForm(forms.Form):
list_keys = [('А', 'А'), ('Б', 'Б'), ('В', 'В'), ('Г', 'Г')] # и т.д.
# обработчик для формирования list_cities и list_cities2
src_key = forms.ChoiceField(label='Адресат начинается на:', widget=forms.Select, choices=list_keys)
src_city = forms.ChoiceField(label='Город отправки:', widget=forms.Select, choices=list_cities)
dest_key = forms.ChoiceField(label='Получатель начинается на:', widget=forms.Select, choices=list_keys)
dest_city = forms.ChoiceField(label='Город приема:', widget=forms.Select, choices=list_cities2)
Офлайн
2
Ну лучше всего это сделать с помощью jQuery, вещайте обработчик на изменение src_key и dest_key, затем скрываете все лишние options в src_city, dest_city
Офлайн
4
magnet85, можно привести пример как это сделать?
Офлайн
2
Сейчас посмотрел, во многих браузерах со скрытием опций из селекта есть проблемы(IE, Chrome, Safari), есть решение, проверил его в firefox 9 и chromium 15
<script type="text/javascript">
$(document).ready(function() {
$.fn.hideOptionGroup = function() {
$(this).hide();
$(this).children().each(function(){
$(this).attr("disabled", "disabled").removeAttr("selected");
});
$(this).appendTo($(this).parent());
}
$.fn.showOptionGroup = function() {
$(this).show();
$(this).children().each(function(){
$(this).removeAttr("disabled" );
});
$(this).prependTo($(this).parent());
$(this).parent().animate({scrollTop:0},0);
}
var symbol = $('select[name=src_key]').val();
$('select[name=src_city] option:not([value^=' + symbol + '])').hideOptionGroup();
$('select[name=src_key]').change(function() {
symbol = $(this).val();
$('select[name=src_city] option').showOptionGroup();
$('select[name=src_city] option[value^=' + symbol +']:first').attr('selected', 'selected');
$('select[name=src_city] option:not([value^=' + symbol + '])').hideOptionGroup();
});
});
</script>
Офлайн
0
Офлайн
4
А если сделать сначала пустые списки формы:
# -*- coding: utf-8 -*-
from django import forms
class OrderForm(forms.Form):
list_cities = []
src_city = forms.ChoiceField(label='Город отправки:', widget=forms.Select, choices=list_cities)
dest_city = forms.ChoiceField(label='Город приема:', widget=forms.Select, choices=list_cities)
Офлайн
568
Evgen_irkЯ делаю так:
А если сделать сначала пустые списки формы:Можно ли после создания формы добавить значения к ней и как это сделать?# -*- coding: utf-8 -*-
from django import forms
class OrderForm(forms.Form):
list_cities = []
src_city = forms.ChoiceField(label='Город отправки:', widget=forms.Select, choices=list_cities)
dest_city = forms.ChoiceField(label='Город приема:', widget=forms.Select, choices=list_cities)
class MicroTerritoryForm(ModelForm):
def __init__(self, *args, **kwargs):
school_id=kwargs.pop('school_id')
super(MicroTerritoryForm, self).__init__(*args, **kwargs)
school=School.objects.get(pk=school_id)
streets=MicroTerritoryStreets.objects.filter(school=school).exclude(all_houses=True)
self.fields['street'].queryset=street.order_by('name')
def cleaned_data(self,*args, **kwargs):
super(MicroTerritoryForm, self).cleaned_data(*args, **kwargs)
class Meta:
model=MicroTerritory
exclude=('school',)
$('#id_place').change(function()
{
$.getJSON("/kladr_street_get", {'territory':$(this).val()} , function(data){
list=''
for (i=0; i<data.data.length; i++)
{
list+="<option value="+data.data[i].id+">"+data.data[i].val+"</option>"
}
$(".street_select").html(list)
})
}
);@login_required
def kladr_street_get(request):
kladr_id=request.GET['territory']
if not kladr_id:
return HttpResponse(simplejson.dumps({}), mimetype="application/json")
code=Kladr.objects.get(id=kladr_id).code
streets=Streets.objects.filter(code__startswith=(str(code))[:11]).order_by('name')
data=[{'id':s.id, 'val': u'%s, %s' %( s.name, s.socr)} for s in streets]
data={'data':data}
return HttpResponse(simplejson.dumps(data), mimetype="application/json")
Офлайн