Найти - Пользователи
Полная версия: Работа с формами созданными из моделей.
Начало » Django » Работа с формами созданными из моделей.
1
fth
Предположим у нас есть страна, в ней города, есть ещё компании, компания может работать только в одной стране, у компании есть офисы располагающиеся в городах, причём в одном городе у компании может быть только один офис. Т.е. получаем такую модель:
class Country(Model):
name = CharField()

class City(Model):
country = ForeignKey(Country, related_name = 'cities')

class Company(Model):
country = ForeignKey(Country, related_name = 'companies')

class Office(Model):
company = ForeignKey(Company, related_name = 'offices')
city = ForeignKey(City, related_name = 'offices')

class Meta:
unique_together = (("company", "city"),)
Возможно ли указать модели, что офис компании может располагаться только в городах той страны которой принадлежит компания? (т.е. some_office.city могла принимать значения только из some_office.company.country.cities)
Задача состоит в написании формы для создания офиса, что бы в выпадающем списке были только города той страны в которой работает компания и в которых нет ещё офисов этой компании.
Как лучше это сделать? Передавать в ручную QuerySet или же это можно сделать культурнее через модель?
fth
Пришёл пока к такому решению:
class NewOfficeForm(ModelForm):
class Meta:
model = Office

def __init__(self, company, *args, **kwargs):
super(ModelForm, self).__init__(*args, **kwargs)
self.fields['city'].queryset = company.country.cities.all()
self.fields['city'].empty_label = None
Только вот не соображу как отфильтровать города в которых уже есть офис…
fth
В общем остановился на такой реализации:
class NewOfficeForm(ModelForm):
class Meta:
model = Office

def __init__(self, company, *args, **kwargs):
super(ModelForm, self).__init__(*args, **kwargs)
all_cities = company.country.cities.all()
buf = [x.id for x in all_cities if x not in [y.city for y in company.offices.all()]]
q_set = company.country.cities.none()
for q_id in buf:
q_set = q_set.__or__(all_cities.filter(id = q_id))
self.fields['city'].queryset = q_set
self.fields['city'].empty_label = None
Но на мой взгляд она достаточно крива, так что буду благодарен, если кто-нибудь укажет на более изящное решение.
romankrv
Работает? так не парься, тебе же не в гугол на собеседование с этим кодом итти. Да?
Или читай по рефакторинг.
fth
Работать, то работает, но решение кривовато, а значит в похожей ситуации в следующий раз я опять буду использовать его, что не есть гуд, поэтому и хотелось бы найти более изящное и правильное решение.
А насчёт рефакторинга не понял… Это где тут можно его провести?
romankrv
Ну например тут:
http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB