代码之家  ›  专栏  ›  技术社区  ›  Bidhan Majhi

如何使用像这样的字符。在Django 2.1的用户名slug中?

  •  0
  • Bidhan Majhi  · 技术社区  · 6 年前

    我正在创建一个简单的web应用程序。用户可以注册并查看他们的个人资料。注册表单运行良好,用户可以完美地注册。

    在表单.py当用户使用现有用户名注册时,我有函数引发验证错误。问题来了。如果有一个用户名类型,例如-'userone',另一个用户类型'用户1'它用'用户1'. 但是当用户想要转到他们的个人资料时,问题出现在URL中。因为我使用username作为slug,所以URL中没有点(.),这就导致了问题。

    re_path 正如Django文档中提到的,但是仍然会出现错误。

        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
    

    视图.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')
    

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

    网址.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'),
    
    ]
    

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Daniel Roseman    6 年前

    这里唯一的问题是,您的URL模式不接受点。你可以把它改成 str

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

    如果你想对你接受的东西有更多的选择,也可以使用正则表达式:

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