如何使用像。在Django 2.1中的用户名slug?

问题描述 投票:0回答:1

我正在创建一个简单的Web应用程序。用户想要注册并可以看到他们的个人资料。注册表单工作正常,用户可以完美注册。

在forms.py中,当用户使用现有用户名注册时,我有提升验证错误的功能。这是问题所在。如果存在用户名类型 - 例如'userone',而另一个用户输入'user.one',则会使用'user.one'保存新用户。但是当用户想要访问他们的个人资料时,URL中会出现问题。因为我使用username作为slug,所以URL中不存在点(。)导致问题。

我已经尝试过使用Django文档中提到的re_path,但仍然遇到错误。

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.朋友

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>

什么应该是一个完美的方法呢?

python django django-templates django-urls django-2.1
1个回答
1
投票

这里唯一的问题是您的网址格式不接受点。您可以将其更改为str,它接受任何内容:

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

或者如果你想对你接受的内容更有选择性,可以使用正则表达式:

re_path(r'user/(?P<slug>[\w.]+)/$', 
© www.soinside.com 2019 - 2024. All rights reserved.