Проблема с сохранением формы Django: объект ‘UserProfile’ не имеет атрибута ‘save_m2m’

#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()