Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 5, 2014 22:18:19

Mari
Зарегистрирован: 2014-05-22
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка форм сложных моделей

Подскажите пожалуйста как грамотно делается добавление данных сложной модели (с ключами) в базу.
Те вот такая учебная модель пользователя
У него есть Город, а у Города есть Тип. На момент добавления пользователя Города и Типа, введенного в форме, в базе может и не быть. Те задача проверить есть ли такой тип в базе, который был указан в форме, если нет, то добавить. Затем есть ли такой город в базе, если нет то добавить с типом, добавленным (или найденном в случае существования) выше. И наконец, добавить пользователя с этим городом.


Первая мысль пришла такая:
В форму пользователя добавить поля соответвующие двум другим моделям, City и CityType. Последние 4 строки свойств:

class MyUserCreationForm(forms.ModelForm):
	email = forms.CharField(label=u'E-mail')
	username = forms.CharField(label=u'Имя пользователя')
	password1 = forms.CharField(label=u'Пароль', widget=forms.PasswordInput)
	password2 = forms.CharField(label=u'Подтверждение пароля', widget=forms.PasswordInput)
	locality_name = forms.CharField()
	locality_type_name = forms.CharField()
	locality_short_type_name = forms.CharField()
	locality_index = forms.CharField()
        class Meta:
		model = MyUser
		fields = ('email', 'username', 'city')

затем в методе clean делать соотвевенные действия:
def clean(self):
		cleaned_data = super(MyUserCreationForm, self).clean()
		locality_name = self.cleaned_data.get('locality_name')
		locality_type_name = self.cleaned_data.get('locality_type_name')
		locality_short_type_name = self.cleaned_data.get('locality_short_type_name')
		locality_index = self.cleaned_data.get('locality_index')
		try:
			city_type = CityType.objects.get(name=locality_type_name)
		except:
			city_type = CityType.objects.create(name=locality_type_name, short_name=locality_short_type_name)
		try:
			city = City.objects.get(index=locality_index)
		except:
			city = City.objects.create(name=locality_name, index=locality_index, city_type=city_type)
		return self.cleaned_data

Тип и город добавляются в базу, но не знаю как в итоге полученный city привязать к модели Пользователя, в котором такое поле есть?

Вообще правильно ли я делаю, или есть какой то другой подход к подобным случаям?

Отредактировано Mari (Июнь 5, 2014 22:20:13)

Офлайн

#2 Июнь 5, 2014 22:27:37

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Обработка форм сложных моделей

Mari
если надо просто еще одно поле AbstractBaseUser это оверкил, а надо просто AbstractUser

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version