Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » вывод данных в форме при первой загрузке [RSS Feed]

#1 Май 3, 2014 16:41:05

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

вывод данных в форме при первой загрузке

люди добрые, помогите пожалуйста разобраться с типовой задачей для формы

есть форма, связанная с БД. необходимо чтобы при первой загрузке поля были заполнены соответствующими значениями из БД(каждому поле соответствует определённая ячейка таблицы). после того как пользователь изменит значение полей в форме и отошлёт её, обновляются данные в БД

эту задачу я решил так:
фрагмент из views.py:

@login_required
def personal_data_page(request):			
	if request.method == 'POST':
		form = PersonalDataForm(request.POST)
		if form.is_valid():	
			entry_user = User.objects.get(username__exact=request.user.username)
			entry_user_profile = UserProfile.objects.get(user_ptr_id__exact=entry_user.id)
			entry_user_profile.family = form.cleaned_data.get('family')
			entry_user_profile.name1 = form.cleaned_data.get('name1')
			entry_user_profile.name2 = form.cleaned_data.get('name2')
			entry_user_profile.nickname = form.cleaned_data.get('nickname')
			entry_user_profile.gender = form.cleaned_data.get('gender')
			entry_user_profile.status = form.cleaned_data.get('status')
			entry_user_profile.city = form.cleaned_data.get('city')
			entry_user_profile.phone = form.cleaned_data.get('phone')
			entry_user_profile.skype = form.cleaned_data.get('skype')
			entry_user_profile.email_address = form.cleaned_data.get('email_address')
			entry_user_profile.other = form.cleaned_data.get('other')
			entry_user_profile.save()	
			
			return HttpResponseRedirect('/userprofile/personal_data_page_changed/')
	else:
		entry_user = User.objects.get(username__exact=request.user.username)
		entry_user_profile = UserProfile.objects.get(user_ptr_id__exact=entry_user.id)
		arg = {
			'family': entry_user_profile.family,
			'name1': entry_user_profile.name1,
			'name2': entry_user_profile.name2,
			'nickname': entry_user_profile.nickname,
			'gender': entry_user_profile.gender,
			'status': entry_user_profile.status,
			'city': entry_user_profile.city,
			'phone': entry_user_profile.phone,
			'skype': entry_user_profile.skype,
			'email_address': entry_user_profile.email_address,
			'other': entry_user_profile.other,
		}
			
			
		form = PersonalDataForm(arg)		
	
	t = loader.get_template('personal_data_page.html')
	c = RequestContext(request, {
		'form': form,
	}, [custom_proc])
	return HttpResponse(t.render(c))

здесь UserProfile это модель, унаследованная от User. таким образом в User содержатся пароль и логин, а в UserProfile - остальные данные(family, name1 и т.д.)

проблема в том, что запись слишком громоздкая. уверен, что существует способ записать приведённый код более компактно и лаконично

помогите пожалуйста исправить

Отредактировано zlodiak (Май 3, 2014 16:43:18)

Офлайн

#2 Май 3, 2014 16:45:06

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

вывод данных в форме при первой загрузке

Офлайн

#3 Май 3, 2014 17:03:00

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

вывод данных в форме при первой загрузке

спасибо конечно. но нельзя ли встроенными средствами джанги обойтись?

Офлайн

#4 Май 3, 2014 17:05:50

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

вывод данных в форме при первой загрузке

zlodiak
что-то на меня нашло…
Попробуй так сделать

form = PersonalDataForm(request.POST,  User.objects.get(username__exact=request.user.username))

Офлайн

#5 Май 3, 2014 17:11:25

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

вывод данных в форме при первой загрузке

пустые поля вижу…

Офлайн

#6 Май 4, 2014 22:39:47

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

вывод данных в форме при первой загрузке

Если PersonalDataForm наследуется от ModelForm, то для достижения вашей цели следует передать в нее аргумент instance при создании. Т.е. что-то в таком духе:

form = PersonalDataForm(request.POST or None, instance=entry_user_profile)
if form.is_valid():
    form.save()

Подробности, конечно же, в этом разделе документации. А вот здесь есть презентация, хорошо показывающая, как можно писать меньше кода в обычных вьюхах с формами.

Отредактировано pythonlove (Май 4, 2014 22:41:16)

Офлайн

  • Начало
  • » Django
  • » вывод данных в форме при первой загрузке[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version