Пользовательский запрос на совпадение не существует; User.DoesNotExist обработчик исключений определен - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь создать нового пользователя через представление, которое реализует подкласс UserCreationForm с именем ChefRegisterationForm. Тестовые данные, предоставленные в тестовом примере, были проверены. Однако, если я запрашиваю существующего пользователя с Model.get(), я получаю следующую ошибку ...

django.contrib.auth.models.DoesNotExist: User matching query does not exist.

Мне не ясно, что вызывает эту ошибку как в случае сбоя запроса определен обработчик исключений User.DoesNotExist.

forms.py

class ChefRegisterationForm(UserCreationForm):

    username = forms.CharField(validators=[validate_username])

    def clean(self):
        cleaned_data = super().clean()
        submitted_username = cleaned_data.get('username')
        submitted_password = cleaned_data.get('password1')

        if submitted_username == submitted_password:
            raise ValidationError(
                "Your password cannot be your username.", code="invalid_password"
            )

    class Meta:
        model = User
        fields = ['username', 'password1', 'password2']

views.py

def register_chef(request):
    if request.method == 'POST':
        new_user_form = ChefRegisterationForm(request.POST)
        if new_user_form.is_valid():
            try:
                username = new_user_form.cleaned_data['username']
                user = User.objects.get(
                    username=username
                )
            except User.DoesNotExist:
                user = authenticate(
                    username=new_user_form.cleaned_data['username'],
                    password=new_user_form.cleaned_data['password2']
                )
                login(request, user)
                messages.info(f"Logged in: Chef {user}")
                return HttpResponseRedirect(reverse("menu:menu_list"))
            else:
                stored_password = check_password(
                    new_user_form.cleaned_data['password1'], 
                    user.password
                )
                if stored_password:
                    messages.info(
                        request,
                        "You already registered an account. Please log in."
                    )
                else:
                    messages.info(
                        request, 
                        f"Username {username} exists. Choose another username."
                    )
                return HttpResponseRedirect(reverse("chef:create_chef"))
        messages.info(
            request, 
            "Registeration failed. Please try again."
        )
    new_user_form = ChefRegisterationForm()
    return render(request, "chef/register_chef.html", {'form': new_user_form})

test_views.py

class TestCreateNewChef(TestCase):

    @classmethod
    def setUpTestData(cls):
        cls.user_signup_data = {
            'username': 'test_chef',
            'password1': 'secret',
            'password2': 'secret'
        }

    def test_new_chef_sign_up_success(self):
        response = self.client.post(
            reverse("chef:register"), 
            self.user_signup_data,
            follow=True
        )
        self.assertRedirects(response, reverse("menu:menu_list"))
        self.assertTemplatedUsed('menu/list_all_current_menus.html')
        self.assertContains(
            response,
            "<p>Logged in: test_chef!</p>",
            html=True
        )

1 Ответ

0 голосов
/ 03 февраля 2020

Если пользователь не существует, вы не можете использовать метод authenticate. Так как он будет искать пользователя и снова поднимать DoesNotExist. Вместо этого вы должны создать нового пользователя:

except User.DoesNotExist:
    user = User.objects.create_user(
        username=new_user_form.cleaned_data['username'],
        password=new_user_form.cleaned_data['password2'],
        email="test@test.com"
     )
     login(request, user)
     messages.info(f"Logged in: Chef {user}")
     return HttpResponseRedirect(reverse("menu:menu_list"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...