如何将URL显示为文本,而不是DB中的数字?

时间:2015-05-08 18:19:35

标签: python django

我是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)

2 个答案:

答案 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字段?)。