这是来自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)
答案 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行。