Метод Django существует () не работает, ошибка «ссылка перед назначением» - PullRequest
0 голосов
/ 09 сентября 2018

после долгого времени поиска решения, я не продвинулся по причине.

Я пытаюсь сделать так, чтобы функционал работал «если существует ():» для «User.username» пользователя, и поэтому избегаю дублирования имени пользователя на моем веб-сайте, но это не работает.

это мой код в views.py:

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']
        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())

Получена ошибка: "локальная переменная 'usernameDatas', на которую ссылается перед присваиванием"

Где моя ошибка? спасибо всем.

1 Ответ

0 голосов
/ 09 сентября 2018

.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() является серьезным препятствием: лучше передать словарь с переменными, которые вы используете.

...