Django Нет обратной ошибки, когда пользователь использует электронную почту в качестве имени пользователя - PullRequest
0 голосов
/ 06 января 2020

Когда пользователь использует электронную почту в качестве имени пользователя, обратный просмотр не выполняется. Но когда я изменяю имя пользователя на имя пользователя без электронной почты, используя панель администратора, это прекрасно работает. Я много искал, но не смог найти подобную проблему.

Моя модель пользователя:

class CustomUser(AbstractUser):    
    date_joined = models.DateField(auto_now_add=True)    
    email = models.EmailField(unique=True)

    def __str__(self):
        return self.username

Отвечать:

class UserUpdateView(SuccessMessageMixin, LoginRequiredMixin, UpdateView):
    template_name = "accounts/user_update.html"
    form_class = UserChangingForm
    model = CustomUser
    slug_field = 'username'
    slug_url_kwarg = 'username'
    success_message = '%(username)s was updated successfully'

    def get_success_url(self):
        return reverse('accounts:user_update', kwargs={'username': self.object.username})

Urls.py:

from . import views
from django.contrib.auth import views as authViews

app_name = 'accounts'

urlpatterns = {
    path('signup/', views.UserSignupView.as_view(), name='signup'),
    path('login/', views.UserLoginView.as_view(), name='login'),
    path('logout/', authViews.LogoutView.as_view(), name='logout'),
    path('<slug:username>/profile/', views.UserUpdateView.as_view(), name='user_update'),}

Ошибка в шаблоне выдается: Сообщение об ошибке:

NoReverseMatch в /

Обратное для 'user_update' с аргументами '(' kkdsjfsdifisdfj@gmail.com ' ,)' не найдено. 1 шаблон (ов)> пробовал: ['account / (? P [-a-zA-Z0-9 _] +) / profile / $']

Я думаю о том, чтобы запретить пользователям использовать специальный символ в поле Имя пользователя при регистрации. Где я не прав?

1 Ответ

1 голос
/ 06 января 2020

ошибка в этой строке

path('<slug:username>/profile/', views.UserUpdateView.as_view(), name='user_update'),

здесь ваше имя пользователя - электронная почта. но вы определили это как поле слизни. измените slug поле.

обновите его с помощью

path('<username>/profile/', views.UserUpdateView.as_view(), name='user_update'),

, если вы хотите запретить использование специального символа в поле Имя пользователя тогда вы можете использовать регулярное выражение и вам нужно будет использовать re_path() или url()

from django.urls import re_path

re_path(r'(?P<username>\w+|[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})/profile/$', views.UserUpdateView.as_view(), name='user_update'),

, пожалуйста, используйте здесь правильное регулярное выражение. для электронной почты вы можете проверить это. Как найти или проверить адрес электронной почты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...