baterson
@baterson
python/django

Django. Как изменять отдельные поля в форме?

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

Форма:
class ProfileForm(forms.ModelForm):
	class Meta:
		model = CustomUser
		fields = ('avatar', 'firstname', 'lastname',
				'date_of_birth',)

		widgets = {
			'date_of_birth': SelectDateWidget(years=range(1920, 2015)),
			}

Вью:
def cabinet(request):
	
	profile = CustomUser.objects.get(pk = request.user.pk)
	profile_user = CustomUser.objects.filter(pk = request.user.pk)
	form = ProfileForm(request.POST, request.FILES or None, instance=profile)
	
	if request.POST and form.is_valid():
		obj = form.save(commit=False)
		obj.profile_user = CustomUser.objects.get(pk=request.user.pk)
		obj.save()
		return redirect(reverse(cabinet))
	return render(request, 'cabinet.html', 
		{'form':form, 'profile_user': profile_user, }, )

Html:
<form action="{% url 'cabinet' %}" method="post" enctype="multipart/form-data">
			{% csrf_token %}
			{{ form|crispy }}
			<button class="btn btn-default" type="submit">Submit</button>
			</form>

Я отображаю на странице все поля формы и если хочу изменить только одно поле, в другое запишется пустое значение.
Я вижу только одно решение, создать отдельную форму для каждого поля.
Параметров в форме больше, я их удалил чтобы наглядней было видно, поэтому подход выше кажется рациональным
  • Вопрос задан
  • 6363 просмотра
Решения вопроса 1
@deliro
Вот так заполняются поля формы значениями.

Вот так превратить модель в словарь для initial.

Можно также использовать UpdateView (CBV) и ничего из перечисленного даже делать не надо.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
dunmaksim
@dunmaksim
Технический писатель
Используйте частичное обновление update() вместо полного save(): https://docs.djangoproject.com/en/1.8/ref/models/q...
При этом вместо POST лучше установить заголовок запроса в PATCH.
Ответ написан
Degibenz
@Degibenz
Можно сделать примерно так CustomUser.objects.get(pk=request.pk).update(**data)
При этом надо составить dict с значениями, которые надо обновить.
{
"user_name" : "test_client"
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы