4

我想为每个创建的帐户创建一个个人资料页面。创建后,可以像访问用户配置文件一样

http://example.com/username

但在创建之前,我应该验证该 url 已经可用并且未被现有的 url 模式采用。例如:会有一个类似的页面

http://example.com/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>/

编辑 1: 您可以将其用作所有无效用户名的列表

于 2012-06-26T12:45:35.040 回答
0

我不认为你可以用django.core.urlresolvers.resolve. 请注意,它只检查固定 url 的模式,而不是 url 的可变部分。在您的情况下,您很可能将“用户名”作为传递给视图的可变参数。此模式也将匹配不存在的用户名。所以检查模式不是很好的解决方案。

更好的方法是分离出不同命名空间中的静态页面或其他页面。例如http://example.com/static/about

或者您可以为您的站点设置预定义的关键字/保留字词,例如 [“关于”,...],并在创建用户时根据用户名检查它。

于 2012-06-26T13:03:57.670 回答
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

首先,用户名的 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 以用户名开头,那么您可以尝试使用以下方法获取 url:https ://stackoverflow.com/a/2094270/884453然后确保用户名都是唯一的针对其他用户名和路由

编辑

在我写这篇文章的时候,有人发布了一个很酷的想法,让验证器变得更有意义。

用来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 回答