Django обновление других полей учетной записи пользователя через Model Form (при входе в систему в качестве администратора)
Я создаю проект на django, который позволяет пользователям создавать и затем размещать проекты.
Приложения включают в себя приложение "пользователи" и приложение "проекты".
Я использую @signals, чтобы "пользователи" создавали/редактировали Профиль, а @signals гарантирует, что базовая модель django User всегда синхронизирована с моделью Профиля, содержащейся в приложении "пользователи".
У меня есть один профиль для суперпользователя, и он настроен не только на доступ к собственному "профилю пользователя" и "сообщениям проекта", которые он может публиковать, но также настроен на просмотр проектов, опубликованных другими пользователями, прежде чем они будут показаны в публичной ленте "сообщений проекта".
.
В модели проекта (в приложении projects models.py) у меня есть поле под названием 'is_approved' со значением по умолчанию false, и "посты проекта" отображаются в публичной ленте только после того, как суперадмин использует свой шаблонный вид формы модели для обновления 'is_approved' с False на True.
Каждый "пост проекта" включает поле Profile в качестве внешнего ключа (один ко многим)
Вышеописанное работает очень хорошо - поскольку суперпользователь может быть аутентифицированным пользователем sessionid и при этом обновлять "посты проекта", которые принадлежат другому профилю.
Теперь моя проблема заключается в том, что я пытаюсь сделать все вышеперечисленное, когда вхожу в систему как суперпользователь, но пытаюсь обновить поля в других Профилях (например, 'is_accepted' с False на True) через модель Form.
Мне нужно сделать так, чтобы при редактировании профиля его статус 'is_accepted' возвращался в False, чтобы суперпользователь мог просмотреть профиль, прежде чем он вернется в публичный список профилей.
В приведенном ниже коде я сначала проверяю, что именно суперпользователь пытается получить доступ к маршруту к этому шаблону 'admin', и, если это не так, возвращаю его на страницу учетной записи. Для этого я использую переменную 'profilej'.
Затем я получаю профиль, который необходимо обновить, и использую для этого переменную 'profileq'.
Когда я распечатываю эти данные, они содержат соответствующие значения. 'profilej' содержит суперпользователя, а 'profileq' содержит профиль, который нужно отредактировать.
@login_required(login_url='login')
def editAccountBoss(request, pk):
profilej = request.user.profile
print(profilej)
if profilej.bossnum != 9999:
return redirect('account')
profileq = Profile.objects.get(id=pk)
print(profileq)
form = ProfileFormBoss(instance=profileq)
В последней строке приведенного выше кода я передаю 'profileq' в переменную формы. Затем эту же "форму" я проверяю и сохраняю в приведенном ниже коде. Проблема, которую я продолжаю получать, заключается в том, что "суперпользователь" (который является аутентифицированным пользователем sessionid) обновляется вместо профиля, который открывается и редактируется. Этот код 'edit profile' работает нормально, когда любой аутентифицированный по sessionid профиль/пользователь обновляет свой собственный профиль, поэтому я не думаю, что он пытается создать дубликат, и все же я получаю следующую ошибку, а за кулисами перед ошибкой поля 'profileq' обновляются для суперпользователя 'profilej'.
вот остальная часть кода:
if request.method == 'POST':
form = ProfileFormBoss(request.POST, request.FILES, instance=profileq)
websocial = request.POST['social_website']
#print(websocial[0:8])
if websocial[0:8] != "https://" and websocial != "":
messages.error(request, 'Use full web address format:
https://www.example.com')
elif form.is_valid():
profileq = form.save(commit=False)
profileq.is_accepted = True
form.save()
return redirect('acc-boss-dash-profiles')
context = {'form': form}
return render(request, 'users/profile_formboss.html', context)
Вот какую ошибку я продолжаю получать. Я пробовал несколько различных альтернатив (например, profileq.save() и т.д.), но продолжаю получать ту же ошибку:
IntegrityError at /profiles/edit-account/ Сбой ограничения UNIQUE: имя пользователя auth_user.username
А вот базовая модель формы:
class ProfileFormBoss(ModelForm):
class Meta:
model = Profile
fields = ['name', 'email', 'username',
'location', 'bio', 'short_intro', 'profile_image', 'is_accepted', 'social_github', 'social_linkedin', 'social_twitter', 'social_youtube', 'social_website']
exclude = ['social_github', 'social_linkedin', 'social_twitter',
'social_youtube']
help_texts = {
'social_website': 'https://www.example.com',
}
widgets = {
'isaccepted': forms.CheckboxSelectMultiple(),
}
def __init__(self, *args, **kwargs):
super(ProfileFormBoss, self).__init__(*args, **kwargs)
for name, field in self.fields.items():
field.widget.attrs.update({'class': 'input'})