【问题标题】:NoReverseMatch in 'a href' HTML link'a href' HTML 链接中的 NoReverseMatch
【发布时间】:2017-04-03 07:02:34
【问题描述】:

我正在尝试在我的 django 应用程序中创建一个重定向到另一个页面的链接,我有视图,我有 url,我有模板,在我看来一切都很好,但是当我尝试'href ' 做链接的页面我得到以下错误:

“views.candidate_detail”的反向参数“()”和关键字 未找到参数'{'pk':''}'。尝试了 0 个模式:[]

views.py

from django.shortcuts import render, get_object_or_404
from .models import Candidate, Criterion, Evaluation
from django import forms
from .forms import CandForm
from .forms import EvalForm
from .forms import TestForm
from django.shortcuts import redirect
from django.db import IntegrityError

def canditate_list(request):
    candidates = Candidate.objects.all()
    evaluation = Evaluation.objects.all()

    ######################## Ponho todos os candidatos e suas respectivas médias em um array em formato dict({Candidato:N})
    sum = 0
    cont = 1
    med = 0
    lista = []
    for cand in candidates:
        cont = 0
        sum = 0
        med = 0
        for e in evaluation:
            if cand == e.candidate:
                sum += e.score
                cont += 1
        if cont > 0:
            med = sum / cont  

        data = {str(cand):med}              ## a Key recebe o candidato no formato string
        lista += [data]

    ##### passo os dicionários contidos na lista anterior para outra lista convertendo-os em string
    lista2 = []
    for l in lista:
        lista2 += [str(l)]

    lista2 = [re.sub(r'[^\w\d.:]+',"",e) for e in lista2]

    eval_cand_list = []                                     #aqui guarda uma lista com os FK candidates convertidos p/ str
    context = {
        'candidates': candidates,
        'evaluation': evaluation,
        'lista2':lista2
    }
    return render(request, 'app/candidate_list.html',context)

def candidate_detail(request, pk):
    candidate = get_object_or_404(Candidate, pk=pk)
    c_name = candidate.name                                 #pega o nome (string) do candidato
    c1 = Evaluation.objects.all()                           #guarda tds Evaluation na variavel  
    scores = []                                             #declara a array que vai receber as notas
    for c in c1:                                            
        cand = str(c.candidate)                             #guarda o nome do candidato do Evaluation atual
        if cand == c_name:                                  #confere se o Evaluation atual corresponde ao candidate atual(pk)
            scores += [c.score]

    soma = 0                                                #variavel que guardara a soma declarada
    for s in scores:
        soma += s                                           #faz a soma dos scores

    average = 0 
    if len(scores) > 0:
        average = soma/len(scores)                              #tira a média

    context = {
        'candidate': candidate,
        'average': average,
    }

    return render(request, 'app/candidate_detail.html', context)

urls.py

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

urlpatterns = [
    url(r'^$', views.canditate_list, name='canditate_list'),
    url(r'^candidato/(?P<pk>[0-9]+)/$', views.candidate_detail, name='candidate_detail'),
    url(r'^cadastrar/$', views.register, name='register'),  # <--! o cadastro fica num link independete
    url(r'^grid/$', views.grid, name='grid'),
    url(r'^candidato/[0-9]+/avaliacao/$', views.evaluation, name='evaluate'), 

]

模板 html:

{% load staticfiles %}
{% load mathfilters %}
<!DOCTYPE html>
<html>
<head>
    <title>Lista de candidatos</title>
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
    <link href="https://fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext" rel="stylesheet" type="text/css"> 
    <link href="{% static 'css/app.css' %}" rel="stylesheet">   
</head>
<body>
    <h1 class="h1t">Lista de Candidatos</h1>
    {% for l in lista2 %}
        <p class="tr"><a href="{% url 'views.candidate_detail' pk=post.pk %}">{{l}}</a></p>
    {% endfor %}

</body>
</html>

【问题讨论】:

  • 解决方案在lista2的值内。显示lista2的值,我们就能回答。
  • 这些值取自 QuerySet。它们可以变化,您希望我如何显示“list2”值?你想让我为其中一个发一个吗?
  • 是的。只需发布一个,如果这是一个很大的列表。我只是想让模式出现。
  • 只是个字符串人,字典转换成字符串
  • 这不是很有帮助!您正在迭代此列表,并且希望从每个项目中 get 一个 pk 以将其传递给 {% url %} 标记。在这个列表中的某个地方,有这个pk。对吗?

标签: python html django django-views


【解决方案1】:

您应该迭代 candidates QuerySet 而不是 lista2 列表。然后你可以这样做:

{% for candidate in candidates %}
    <p class="tr">
        <a href="{% url 'candidate_detail' candidate.pk %}">{{ candidate }}</a>
    </p>
{% endfor %}

【讨论】:

  • 但是我需要显示候选人和你的平均水平,因此我创建了一个循环,将它们放入字典并将他转换为字符串以便更好地查看...有没有办法做到这一点使用字符串列表重定向?
  • 对不起,我错了,它可以工作......但是为什么我不能用字符串列表来做呢?
  • 因为字符串不是 Model 对象,您可以对其调用属性 (list_element.id)。该字符串没有属性id。这只是一个普通的字符串。我会更新我的答案以满足您的需求。虽然,它不会很优雅。
  • hmm ..知道了,非常感谢您的关注..所以,我需要选择查询集中的候选人(他们是模特),并将他们的 suuta 平均值他们的笔记在另一个模型中,您知道是否有任何方法可以在许多不同的模型中具有相同值的共同属性?候选平均值在评估模型中......或者以某种方式访问​​其他模型的属性......(或者为此创建另一个问题更好?)再次感谢!
  • 最好为此创建另一个问题!也许annotate 可能对您有所帮助。如果以上任何答案帮助您将其标记为已接受。
【解决方案2】:

href 替换为以下内容:

{% load staticfiles %}
{% load mathfilters %}
<!DOCTYPE html>
<html>
<head>
    <title>Lista de candidatos</title>
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
    <link href="https://fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext" rel="stylesheet" type="text/css"> 
    <link href="{% static 'css/app.css' %}" rel="stylesheet">   
</head>
<body>
    <h1 class="h1t">Lista de Candidatos</h1>
    {% for l in lista2 %}
        <p class="tr"><a href="{% url 'candidate_detail' post.pk %}">{{l}}</a></p>
    {% endfor %}

</body>
</html>

在 Django 中,当使用url 引用视图时,您需要使用您在urls.py 中为其定义的name 属性

来自 OP 的屏幕截图:file

【讨论】:

  • 感谢您的关注,但它不起作用:使用参数 '('',)' 和关键字参数 '{}' 反向查找'candidate_detail'。尝试了 1 种模式:['candidato/(?P[0-9]+)/$']
  • @DouglasdaSilva。那是因为 post.pk 没有定义。您正在迭代 lista2lista2 中的每个元素是否都有 pk 属性?
  • @SreetamDas 附上截图
猜你喜欢
  • 2014-10-21
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 2014-06-10
  • 2021-11-29
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多