(Django)如何将两个网址映射到一个视图?

时间:2017-03-03 09:06:08

标签: python django django-views django-urls

这是来自models.py的我的课程:

class Person(models.Model):
    name = models.CharField(max_length=64)
    persnr = models.AutoField(primary_key=True)

这是我的观点:

def show_person(request, persnr):
    pers = get_object_or_404(Person, pk=persnr)
    context={'pers':pers}
    return render(request, 'company/person.html', context)

这是我的网址:

url(r'^show_person/(?P<persnr>\d+)', "company.views.show_person", name='show_person'),

如何使用这两个网址获取相同的视图(show_person):

server/show_person/(persnr)

server/show_person/(name)

4 个答案:

答案 0 :(得分:5)

稍微不同的方法是接受两个单独的参数,一个用于pk,另一个用于名称:

url(r'^show_person/(?P<persnr>\d+)', "company.views.show_person", name='show_person'),
url(r'^show_person/(?P<name>\w+)', "company.views.show_person", name='show_person'),

def show_person(request, persnr=None, name=None):
    if persnr is not None:
        pers = get_object_or_404(Person, pk=persnr)
    elif name is not None:
        pers = get_object_or_404(Person, name=name)
    else:
        raise Http404

答案 1 :(得分:2)

Server failed to start due to error: SequelizeDatabaseError: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'JSON,twitterJSON,googleJSON

答案 2 :(得分:1)

你可以做到

pers = get_object_or_404(Person, Q(name=persnr)|Q(persnr=persnr))

答案 3 :(得分:-2)

我认为将2个URL映射到同一个视图函数会更清楚:

url(r'^show_person/(?P<persnr_or_name>\d+)', "company.views.show_person", name='show_person'),
url(r'^show_person/(?P<persnr_or_name>.*)', "company.views.show_person", name='show_person'),


def show_person(request, persnr_or_name):
    if persnr_or_name.isdigit():
        pers = get_object_or_404(Person, pk=persnr_or_name)
    else:
        pers = get_object_or_404(Person, name=persnr_or_name)
    context={'pers':pers}
    return render(request, 'company/person.html', context)

并且假设您不允许纯数字作为大多数网站的名称。

但对我来说,我更喜欢:

url(r'^show_person/(?P<persnr_or_name>\d+)', "company.views.show_person", name='show_person_by_pk'),
url(r'^show_person/(?P<persnr_or_name>.*)', "company.views.show_person", name='show_person_by_name'),


def show_person_by_pk(request, pk):
    pers = Person.objects.get_or_404(pk)
    context={'pers':pers}
    return render(request, 'company/person.html', context)

def show_person_by_name(request, name):
    pers = get_object_or_404(Person, name=name)
    context={'pers':pers}
    return render(request, 'company/person.html', context)

如果您愿意,可以将视线缩短为2行。

相关问题