Как использовать такие символы, как.в имени пользователя слизняк в Django 2.1? - PullRequest
0 голосов
/ 16 сентября 2018

Я создаю простое веб-приложение.Пользователь предполагает регистрацию и может видеть свой профиль.Форма регистрации работает нормально, и пользователь может зарегистрироваться совершенно.

В файле forms.py у меня есть функция для выдачи ошибки проверки при регистрации пользователя с существующим именем пользователя.Здесь проблема.Если есть, например, типы имен пользователей - «userone», а другой пользователь вводит «user.one», он сохраняет нового пользователя с «user.one».Но когда пользователь хочет перейти в свой профиль, проблема возникает в URL.Поскольку я использую имя пользователя как slug, точка (.) Не присутствует в URL, что приводит к проблеме.

Я пробовал с re_path, как упомянуто в документе Django, но все еще получаю ошибки.

forms.py для проверки уникального имени пользователя

    def clean_username(self):
    username = self.cleaned_data.get('username')
    email = self.cleaned_data.get('email')

    if username and User.objects.filter(username=username).exclude(email=email).count():
        raise forms.ValidationError('This username already exists')
    return username

views.py (класс регистрации)

class SignupView(View):
form_class = SignupForm
template_name = 'webapp/user_signup.html'

def get(self, request):
    form = self.form_class(None)
    return render(request, self.template_name, {'form':form})

def post(self, request):
    form = self.form_class(request.POST)

    if form.is_valid():
        user = form.save(commit=False)
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        user.set_password(password)
        user.save()


        user = authenticate(username=username, password=password)

        if user is not None:
            if user.is_active:
                login(request, user)
                return redirect('webapp:home')

views.py (для класса профиля)

class ProfileView(generic.DetailView):
model = User
slug_field = 'username'
template_name = 'webapp/user_profile.html'

urls.py

urlpatterns = [
# user signup link
path('user/signup/', views.SignupView.as_view(), name='signup'),

. . . .. . . .. . . .. 

# user profile view
path('user/<slug:slug>/', views.ProfileView.as_view(), name='user_profile'),

]

HTML

<a href="{% url 'webapp:user_profile' article.user.username %}">{{article.user.first_name}} {{article.user.last_name}}</a>

Каким должен быть идеальный подход к этому?

1 Ответ

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

Единственная проблема здесь в том, что ваш шаблон URL не принимает точки.Вы можете изменить его на str, который принимает все:

path('user/<str:slug>/',

или использовать регулярное выражение, если вы хотите быть более избирательным в отношении того, что вы принимаете:

re_path(r'user/(?P<slug>[\w.]+)/$', 
...