提问者:小点点

Django中的NoRecreverematch不工作尝试了一切


未找到参数得“Project Detail”得反向。 已尝试1个模式:['projects/(?p[0-9]+)/$']

请求方法:GET

请求URL:http://localhost:8000/projects/yourprojects

Django版本:3.0.4

异常类型:NoReverseMatch

异常值:未找到参数的“project detail”的Reverse。 已尝试1个模式:['projects/(?p[0-9]+)/$']

urls.py文件

from django.urls import path, include
from . import views

urlpatterns = [
    path('newproject', views.newproject, name='newproject'),
    path('yourprojects', views.yourprojects, name='yourprojects'),
    path('<int:projectinfo_id>/', views.projectDetail, name='projectDetail'),
]

views.py文件

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from .models import Projectinfo
from django.utils import timezone
from django.views.decorators.csrf import csrf_exempt,csrf_protect


def home(request):
    return render(request, 'projects/home.html')

def yourprojects(request):
    projectinfo = Projectinfo.objects
    return render(request, 'projects/yourprojects.html', {'projectinfo':projectinfo})


@login_required
def newproject(request):
    if request.method == 'POST':
        if request.POST['title'] and request.POST['branch'] and request.POST['directorate'] and request.POST['email'] and request.POST['program_service'] and request.POST['giturl']:
            projectinfo = Projectinfo()
            projectinfo.title = request.POST['title']
            projectinfo.branch = request.POST['branch']
            projectinfo.directorate = request.POST['directorate']
            projectinfo.email = request.POST['email']
            projectinfo.program_service = request.POST['program_service']
            if request.POST['giturl'].startswith('http://') or request.POST['giturl'].startswith('https://'):
                projectinfo.giturl = request.POST['giturl']
            else:
                projectinfo.giturl = 'http://' + request.POST['giturl']
            projectinfo.pub_date = timezone.datetime.now()
            projectinfo.project_lead = request.user
            projectinfo.save()
            return redirect('/projects/' + str(projectinfo.id))
        else:
            return render(request, 'projects/newproject.html', {'error': 'All fields are required'})


    else:
        return render(request, 'projects/newproject.html')


def projectDetail(request, projectinfo_id):
    projectinfo = get_object_or_404(Projectinfo, pk=projectinfo_id)
    return render(request, 'projects/projectDetail.html', {'projectinfo': projectinfo})

yourprojects.html

{% extends 'base.html' %}

{% block content %}


{% load static %}

<main>

    <div class="container">

      <h3 class="center">Your Projects</h3>

  {% for projectinfo in projectinfo.all %}
  <div class="row" onclick="window.location='{% url 'projectDetail' projectinfo.id %}';">
    <div class="col s6 m6">
      <div class="card blue-grey darken-1">
        <div class="card-content white-text">
          <span class="card-title">{{ projectinfo.title }}</span>
          <div class="card-image">
            <img class="align-center" src="{% static 'Images/RandESmall.svg' %}" width="179" height="135">
          </div>
          <p>This is ROE Comments. A projects that uses natural language processing to help improve and streamline the EI Process.</p>
        </div>
        <div class="card-action">
          <a class="center" href="{% url 'projectDetail' projectinfo.id %}">View / Edit</a>
        </div>
      </div>
    </div>
    {% endfor %}
    </div>
</main>

{% endblock %}

共1个答案

匿名用户

url正则表达式应为数字[0-9]+:

(?P<projectinfo_id>[0-9]+)

但是您要传入alpha:yourprojects

http://localhost:8000/projects/yourprojects

尝试,传入一个数字或更新正则表达式:

(?P<projectinfo_id>[0-9a-z]+)

或者更新项目的url,具体取决于get请求的目的地:

path('^projects/yourprojects/$', views.yourprojects, name='yourprojects'),

并尝试使用/不使用尾随斜杠:

http://localhost:8000/projects/yourprojects
http://localhost:8000/projects/yourprojects/