4

作成したアカウントごとにプロフィール ページを作成したいと考えています。ユーザープロファイルが作成されると、次のようにアクセスできます

http://example.com/ユーザー名

ただし、作成する前に、URL が既に使用可能であり、既存の URL パターンで使用されていないことを検証する必要があります。例:次のようなページがあります

http://example.com/about

現在、「about」は有効なユーザーではありません。しかし、これは有効な URL パターンです。「about」という名前のユーザー作成を防止できるはずです。そのためには、その名前のユーザーが既に存在するかどうかを確認するだけでなく、URL パターンを確認する必要があります。これを行う方法?

簡単な方法は、プロファイル ページに次のような URL パターンを設定することです: http://example.com/user/username

しかし、 http://example.com/usernameのようなプロファイル ページが必要です 。

4

5 に答える 5

2

アドレスをビューに解決しようとするだけです。

from django.core.urlresolvers import resolve
from myapp.views import user_profile_view

try:
    my_view = resolve("/%s/" % user_name)
    if my_view == user_profile_view:
        # We match the user_profile_view, so that's OK.
    else:
        # oops, we have another view that is mapped on that URL
    # you already have something mapped on this address
except:
    # app doesn't have such path

編集:

別の方法でチェックを行うこともできます。

def user_profile_view(request, user_name):
    # some code here

user_profile_view.name = "User Profile View"

そして、上記のチェックは次のようになります。

if getattr(my_view, "name", None) == "User Profile View":
    ...
于 2012-06-26T12:34:15.327 に答える
1

カスタム フォーム フィールドの検証を追加できます。この投稿を見てください。 Django とカスタム フォームの検証

raise forms.ValidationError(u'please choose another username') エラーをチェックして発生させます。

または、ユーザーの URL として以下を設定してみてください。 example.com/user/<username>/

edit 1 : これをすべての無効なユーザー名のリストとして使用できます

于 2012-06-26T12:45:35.040 に答える
0

ユーザー名ビューを urls.py の最後に配置して、他の URL ルールが最初にチェックされるようにします。

次に、最も簡単な方法は、ユーザー登録の検証に使用する無効なユーザー名のリストを用意することです。

def clean_username(self):
    INVALID_USERNAMES = ('about', 'admin', 'register', '...')

    username = self.cleaned_data['username']
    try:
        user = User.objects.get(username=username)
    except User.DoesNotExist:
        pass
    else:
        raise forms.ValidationError(u'%s already exists' % username )

    if username in INVALID_USERNAMES:
        raise forms.ValidationError(u'%s is not a valid username' % username )

    return username
于 2012-06-26T13:09:04.810 に答える
0

で確認できないと思いますdjango.core.urlresolvers.resolve。URLの可変部分ではなく、固定URLのパターンをチェックするだけであることに注意してください。あなたの場合、ビューに渡される変数パラメーターとして「ユーザー名」を使用する可能性が最も高いでしょう。このパターンは、存在しないユーザー名にも一致します。したがって、チェックパターンは良い解決策ではありません。

より良い方法は、異なる名前空間の静的ページまたは他のページを分離することです。例: http://example.com/static/about

または、サイトに事前定義されたキーワード/予約語 ([ "about", ... ] など) を設定し、ユーザーの作成時にユーザー名と照合することもできます。

于 2012-06-26T13:03:57.670 に答える
0

まず、ユーザー名の URL ルール:

url(r'^(?P<username>[-\w]+)/$', 'membership.views.profile', name='profile'),

ユーザー名が既存の URL ルールと競合しないようにするのは少し難しいです。

私が通常これを処理する方法は、URL に一意性を追加することです。

url(r'^user/(?P<username>[-\w]+)/$', 'membership.views.profile', name='profile'),

プロファイルの URL をユーザー名で開始する必要がある場合は、https ://stackoverflow.com/a/2094270/884453 のような方法を使用して URL を取得し、ユーザー名が両方とも一意であることを確認してください。他のユーザー名およびルートに対して

編集

私がこれを書いているとき、誰かがより理にかなっているバリデーターのクールなアイデアを投稿しました。

一意性をチェックするために使用from django.core.urlresolvers import resolveすることは素晴らしい解決策です

from django.core.exceptions import ValidationError
from django.core.urlresolvers import resolve

def validate_unique_resolve(value):
    urlroute = True
    try:
        urlroute = resolve(path, urlconf)
    except urlresolvers.Resolver404:
        urlroute = False

    if urlroute != False :
        raise ValidationError(u'%s is a reserved url pattern' % value)
于 2012-06-26T13:48:47.717 に答える