view.py中的问题:消息错误带有基数10的int()的文字无效

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

标签: python django django-views django-urls

我为我的Django应用创建了以下结构:

../programs/  #home page for the app 
../program/id #detailed page about a specific program stored in the db

但是,当我尝试从浏览器访问../programs/1(1是我希望查看详细信息的程序的ID)时出现以下错误:

ValueError at /programs/1/
invalid literal for int() with base 10: '1/'
Request Method: GET
Request URL:    http://127.0.0.1:8000/programs/1/
Django Version: 1.10.7
Exception Type: ValueError
Exception Value:    
invalid literal for int() with base 10: '1/'

这是我的代码:

views.py

from django.http import Http404
from django.shortcuts import render
from .models import Step, Cycle, Program, MotorSetting, GeneralSetting
from django.core.exceptions import ObjectDoesNotExist

def index(request):
   all_programs = Program.objects.all()
   context = {
       'all_programs': all_programs
   }
   return render(request, 'programs/index.html', context)


def program(request, program_id):
    try:
        program = Program.objects.filter(id=program_id).get()
        return render(request, 'programs/program.html', {'program': 
        program})
    except ObjectDoesNotExist:
        raise Http404("A program with this ID does not exist yet.")

program.html

{{ program }}

programs.urls.py

from django.conf.urls import url
from . import views

urlpatterns = [
    #frontend homepage
    url(r'^$', views.index, name='index'),

    #single program page
    url(r'^(?P<program_id>[0-9]+/)$', views.program, name='program'),
]

models.py

from django.db import models
from django.core.validators import MaxValueValidator, MinValueValidator

class Program(models.Model):
    program_name = models.CharField(max_length=50)
    program_description = models.CharField(max_length=250)
    cycles = models.ManyToManyField(Cycle)

    def __str__(self):
        return self.program_name

我似乎无法发现错误,希望有人可以提供帮助。非常感谢提前!

2 个答案:

答案 0 :(得分:3)

更改&#39; /&#39;的位置来自url regex,

更改

url(r'^(?P<program_id>[0-9]+/)$', views.program, name='program'),

要,

url(r'^(?P<program_id>[0-9]+)/$', views.program, name='program'),

答案 1 :(得分:3)

url(r'^(?P<program_id>[0-9]+/)$', views.program, name='program'),中的模式urls.py会捕获/组中的program_id。像这样将它移出组:

from django.conf.urls import url
from . import views

urlpatterns = [
    #frontend homepage
    url(r'^$', views.index, name='index'),

    #single program page
    url(r'^(?P<program_id>[0-9]+)/$', views.program, name='program'),
                                 ^ here
]