#python #django
#python #django
Вопрос:
У меня есть форма Django, в которой я пытаюсь сохранить данные профиля пользователя. У моего UserProfile
есть поле «многие ко многим», которое у меня возникают проблемы с сохранением. Вот моя попытка просмотра кода:
@login_required
def updateProfile(request, uid):
import pdb; pdb.set_trace()
"""
First, grab the existing user data out of the db.
If it's not there, we'll create it, then fill in the blanks from user input on post.
"""
requested_user = get_object_or_404(User, pk=uid)
user_profile = None
try:
user_profile = UserProfile.objects.get(user = requested_user)
except UserProfile.DoesNotExist:
default_skill_level = SkillLevel.objects.all()[0] # default value.
user_profile = UserProfile(user = requested_user, skill_level = default_skill_level)
user_profile.save()
if request.method == 'POST':
form = UserProfileForm(request.POST, instance = user_profile)
if form.is_valid() and (request.user.id == uid or request.user.is_superuser):
obj = form.save(commit=False) # get just the object but don't commit it yet.
obj.save() # finally save it.
obj.save_m2m() # this is failing. UserProfile has no attribute save_m2m
return index(request)
else:
print "Not authorized to do that! Implement real authorization someday."
return index(request)
else:
profile_form = UserProfileForm(instance=user_profile)
context = {
'user' : request.user,
'form' : profile_form
}
return render(request, 'booker/profile.html', context)
В сообщении, после проверки формы, я могу сохранить базовый объект, но впоследствии сохранение многих ко многим полей завершается ошибкой с данным исключением. Как правильно поступить с этим?
Ответ №1:
Пример:
...
if formset.is_valid():
items = formset.save(commit=False)
for item in items:
item.save()
formset.save_m2m()
E:
Попробуйте это:
if form.is_valid() and (request.user.id == uid or request.user.is_superuser):
obj = form.save(commit=False) # get just the object but don't commit it yet.
obj.save() # finally save it.
form.save_m2m()
Комментарии:
1. Спасибо за ваш комментарий. Перебор элементов, похоже, не работает.
'UserProfile' object is not iterable
Ответ №2:
save_m2m () требуется только в том случае, если вы ранее сохраняли с commit = False . В вашем примере сохранение commit = False не представляется необходимым.
Например. вы могли бы заменить
obj = form.save(commit=False) # get just the object but don't commit it yet.
obj.save() # finally save it.
obj.save_m2m() # this is failing. UserProfile has no attribute save_m2m
С:
form.save()