.exists()
является не источником проблемы. Это довольно общая ошибка в Python. Это означает, что вы используете переменную до того, как вы присвоили ей значение. Теперь в строке .exists()
используется только одна локальная переменная: usernameDatas
. Так что, вероятно, эта переменная не назначена.
Если мы сейчас посмотрим на возможный сценарий, в котором он недействителен, мы увидим, что это может произойти, если form.is_valid()
не удастся (вернет False
). Самый простой способ справиться с этим - вставить деталь:
def edit_profil(request, pk=id):
error_name = reverse_lazy('profil_edit')
template_name="blog/edit_profil.html"
if request.method == "POST":
form = EditProfilForm(data=request.POST, instance=request.user)
if form.is_valid():
usernameDatas = form.cleaned_data['username']
# inline relevant parts
if User.objects.filter(username=usernameDatas).exists():
messages.error(request, 'This is Username already exists !')
return redirect(error_name)
else:
user = form.save(commit=False)
user.email = form.cleaned_data['email']
user.username=usernameDatas
user.save()
return redirect('/blog/profil')
else:
form = EditProfilForm(instance=request.user)
return render(request, template_name, locals())
Обратите внимание, что вышеприведенное является элегантным способом решения проблемы. Если вы укажете unique=True
для поля username
соответствующей модели Django, то форма автоматически подтвердит это . Кроме того, вы указываете пути в redirct(..)
вместо имени представления, что делает его чувствительным к изменениям URL. Наконец, использование locals()
является серьезным препятствием: лучше передать словарь с переменными, которые вы используете.