class TestForm(forms.ModelForm):
manager = forms.ModelChoiceField(queryset=Manager.objects.filter(city=...))
...
class Meta:
...
Каким образом это сделать?)
Пробовал в __init__'е добавлять поля, но, видимо, я чего то не понимаю в корне :(
class TestForm(forms.ModelForm):
manager = forms.ModelChoiceField(queryset=Manager.objects.filter(city=...))
...
class Meta:
...
FerromanТак так и сделайте.
Было бы классно так: form = TestForm(city=City.objects.get(…)), потом этот city попадает в __init__ (тот, который будет от TestForm), который модифицирует queryset, или добавляет поле динамически.
FerromanНет.
Хе. Field.initial не поможет случайно smile?
class TestForm(forms.ModelForm):
def __init__(self, city=None, *args, **kwargs):
self.city = city
super(self, TestForm).__init__(*args, **kwargs)
if self.city:
self.fields['manager'] = forms.ModelChoiceField(queryset = Manager.objects.filter(city=self.city))
else:
self.fields['manager'] = forms.ModelChoiceField(queryset = Manager.objects.all())
...
testform = TestForm(City.objects.get(pk = some_city_id))
class TestForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
# city придет в kwargs при первой инициализации и надо будет его вытащить,
# в противном случае ModelForm'овский __init__ ругнется на неизвестный аргумент
if 'city' in kwargs:
self.city = kwargs.pop('city')
else:
# один раз инициализированному полю уже не понадобится city, так что все будет хорошо и после request.POST
# даже в таком случае
self.city = None
super(TestForm, self).__init__(*args, **kwargs)
if self.city:
self.fields['manager'] = forms.ModelChoiceField(queryset = Manager.objects.filter(city=self.city))
else:
self.fields['manager'] = forms.ModelChoiceField(queryset = Manager.objects.all())
# views.py
def smth(request):
form = None
if "POST" == request.method:
# это случай с отправленной формой, здесь уже не нужен city, поле уже инициализировано с нужным фильтром
form = TestForm(request.POST)
# а если формы нет, создаем и передаем ей нужный City
if form is None:
form = TestForm(city=City.objects.get(pk = some_city_id))
return render_to_response...