Я пытаюсь создать нового пользователя через представление, которое реализует подкласс 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
)