我是Python的新手,我在地址栏中显示URL的方式有问题。现在的URL是localhost:8000/1 /我希望URL是localhost:8000 /字段中的条目名称/有人可以给我一个提示。
项目/ urls.py
from django.conf.urls import include, url
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.contrib import admin
urlpatterns = [
url(r'^$', 'papers.views.index', name='index'),
url(r'^(?P<question_id>[0-9]+)/$', 'papers.views.detail', name='detail'),
url(r'^admin/', include(admin.site.urls)),
]
urlpatterns += staticfiles_urlpatterns()
文件/ views.py
from django.shortcuts import render
from .models import Question
def index(request):
latest_question_list = Question.objects.all
context = {'latest_question_list': latest_question_list}
return render(request, 'papers/index.html', context)
def detail(request, question_id):
question = Question.objects.get(pk=question_id)
return render(request, 'papers/detail.html', {'question': question})
文件/模板/纸/ detail.html
{% extends "master2.html" %}
{% block h1 %}
<div class="center">
<h4>{{question.naslov}} </h4>
<p>{{question.opsirnije_text}}</p>
</div>
{% endblock %}
{% block title %} Detail {% endblock %}
文件/ models.py
from django.db import models
class Question(models.Model):
naslov = models.CharField(max_length=200)
opis = models.CharField(max_length=200)
datum_objave = models.DateTimeField('date published')
opsirnije_text = models.TextField(max_length=20000)
def __str__(self):
return self.naslov
def was_published_recently(self):
return self.datum_objave >= timezone.now() - datetime.timedelta(days=1)
答案 0 :(得分:2)
前言:首先,让我们澄清映射事物的方向。您没有为您的数据库中的对象分配网址;请求可以是任何网址,然后Django必须弄明白这意味着什么,以及如何回复。
即它{url} -> looks up object
,而不是{object} -> has a URL
这是您的网址:
url(r'^(?P<question_id>[0-9]+)/$', 'papers.views.detail', name='detail'),
以下是您处理它的地方:
def detail(request, question_id):
question = Question.objects.get(pk=question_id)
所以当有人在localhost:8000/34/
中输入时,它会匹配正则表达式规则&#34;基本URL后跟数字&#34;会发生什么?如果您想将其更改为&#34;基本网址后跟名称&#34;,您可以这样做:
url(r'^(?P<question_name>[\w_-]+)/$', 'papers.views.detail', name='detail'),
(特别是在这里,字母,或连字符或下划线字符;根据您的&#34;问题名称&#34;看起来像修改正则表达式。)
然后,您需要处理您的处理程序必须接受名称的事实:
def detail(request, question_name):
question = Question.objects.get(naslov=question_name)
这里的限制是.get
查询必须产生唯一的结果;如果多个问题具有相同的名称,那么您将遇到麻烦。
答案 1 :(得分:1)
您需要先更改papers.view.detail
的网址格式,使其不仅仅匹配整数,例如\w+
而不是[0-9]+
。您可能也想重命名捕获组。见https://docs.python.org/2/library/re.html。
然后,您需要更改detail
方法获取与捕获组名称对应的参数,并通过该参数查询对象(我猜是naslov
字段?)。