我正在创建一个简单的Web应用程序。用户假设要注册并可以查看其个人资料。注册表单工作正常,用户可以完美注册。
在forms.py中,当用户使用现有用户名注册时,我具有引发验证错误的功能。这是问题所在。如果有一个用户名类型,例如'userone',而另一个用户键入'user.one',则将新用户保存为'user.one'。但是,当用户想要转到其个人资料时,URL中会出现问题。因为我将用户名用作子名,所以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.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>
什么是完美的方法呢?
答案 0 :(得分:1)
这里唯一的问题是您的URL模式不接受点。您可以将其更改为str
,它接受任何内容:
path('user/<str:slug>/',
或者,如果您想对接受的内容有更多选择,请使用正则表达式:
re_path(r'user/(?P<slug>[\w.]+)/$',