0

シンプルな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>

これに対する完璧なアプローチは何ですか?

4

1 に答える 1