Python 如何在django中使用url模式搜索字符串?

Python 如何在django中使用url模式搜索字符串?,python,django,Python,Django,我想为创建的每个帐户创建一个配置文件页面。一旦创建了用户配置文件,就可以像 但是,在创建之前,我应该验证url是否已经可用,并且没有被现有的url模式使用。例如:将会有一个像这样的页面 现在“about”不是有效的用户。但这是一种有效的url模式。我应该能够阻止名为“about”的用户创建。为此,除了检查具有该名称的用户是否已经存在之外,我还需要检查url模式。如何做到这一点 一个简单的解决方法是为配置文件页面设置如下url模式: 但是我有一个强烈的要求,就是要有如下的个人资料页面 您只需

我想为创建的每个帐户创建一个配置文件页面。一旦创建了用户配置文件,就可以像

但是,在创建之前,我应该验证url是否已经可用,并且没有被现有的url模式使用。例如:将会有一个像这样的页面

现在“about”不是有效的用户。但这是一种有效的url模式。我应该能够阻止名为“about”的用户创建。为此,除了检查具有该名称的用户是否已经存在之外,我还需要检查url模式。如何做到这一点

一个简单的解决方法是为配置文件页面设置如下url模式:

但是我有一个强烈的要求,就是要有如下的个人资料页面

您只需尝试将地址解析为视图即可:

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":
    ...

您可以添加自定义表单字段验证。看看这个帖子。

raise forms.ValidationError(请选择其他用户名)
检查并提出错误

或者您可以尝试将以下内容设置为用户的url,
example.com/user/

编辑1:
我认为您无法使用
django.core.urlresolvers.resolve检查这一点。注意,它只是检查固定url的模式,而不是url的可变部分。在您的情况下,您很可能将“username”作为变量参数传递给视图。此模式也将与不存在的用户名匹配。因此,检查模式不是一个好的解决方案

更好的方法是在不同的命名空间中分离静态页面或其他页面。e、 g


或者,您可以为您的站点设置预定义的关键字/保留字,例如[about],…],并在创建用户时对照用户名进行检查。

将您的用户名视图放在url.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

首先,用户名的url规则:

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

你能展示一些你目前用来验证url的代码吗?我想说,像url:return False中的
if'about'这样的东西可能就足够了,但可能我误解了这个问题。例如,在urls.py中,我有url(r'^admin/',include(admin.site.url)),现在,视图函数不应该允许创建名为“admin”的用户,尽管没有具有该名称的现有用户。这不起作用!它总是转到例外条件:-(哦,是的。您只需检查此URL(r'^admin/',include(admin.site.url))返回的视图名称即可尝试:urlresolvers.resolve(“/%s'%admin')match=“路径已存在”除外:match=“不匹配”我总是得到“不匹配”是的,请查看我的更新答案。您有一个针对用户的全面视图处理程序。因此,您只需检查此URL是否由用户配置文件视图处理(这意味着通配符匹配),或者它是否由另一个视图处理。它总是转到例外条件!UrlResolver.resolve总是引发异常。
url(r'^user/(?P<username>[-\w]+)/$', 'membership.views.profile', name='profile'),
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)