找到参数为'('',)'的'files'的Revserse。尝试了1种模式:

时间:2018-08-27 14:33:49

标签: django-templates

我是django的新手,正在尝试了解外键关系以及如何访问与另一个人有关的数据库信息。我正在使用django 2.0。

我一直收到错误:找到带有参数'('',)'的'文件'的Revserse。尝试了1种模式:

Traceback:

File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
packages/django/core/handlers/exception.py" in inner
  35.             response = get_response(request)

File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
packages/django/core/handlers/base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, 
             request)

File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
packages/django/core/handlers/base.py" in _get_response
  126.                 response = wrapped_callback(request, 
       *callback_args, **callback_kwargs)

 File "/home/travis/atom/My_Django_stuff/ixia_results/results/views.py" in 
 files
   30.     return render(request, 'results/results_files.html', context= 
  {'directory':directory})

 File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
packages/django/shortcuts.py" in render
  36.     content = loader.render_to_string(template_name, context, 
     request, using=using)

 File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
 packages/django/template/loader.py" in render_to_string
  62.     return template.render(context, request)

 File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
 packages/django/template/backends/django.py" in render
  61.             return self.template.render(context)

 File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
 packages/django/template/base.py" in render
  175.                     return self._render(context)

File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
packages/django/template/base.py" in _render
  167.         return self.nodelist.render(context)

File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
packages/django/template/base.py" in render
  943.                 bit = node.render_annotated(context)

File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
packages/django/template/base.py" in render_annotated
  910.             return self.render(context)

File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
packages/django/template/loader_tags.py" in render
  155.             return compiled_parent._render(context)

File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
packages/django/template/base.py" in _render
  167.         return self.nodelist.render(context)

File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
packages/django/template/base.py" in render
   943.                 bit = node.render_annotated(context)

File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
 packages/django/template/base.py" in render_annotated
  910.             return self.render(context)

File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
packages/django/template/loader_tags.py" in render
  67.                 result = block.nodelist.render(context)

File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
packages/django/template/base.py" in render
  943.                 bit = node.render_annotated(context)

File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
packages/django/template/base.py" in render_annotated
  910.             return self.render(context)

File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
packages/django/template/defaulttags.py" in render
  447.             url = reverse(view_name, args=args, kwargs=kwargs, 
         current_app=current_app)

File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
packages/django/urls/base.py" in reverse
  88.     return iri_to_uri(resolver._reverse_with_prefix(view, prefix, 
           *args, **kwargs))

 File "/home/travis/anaconda3/envs/MyDjangoMysqlEnv/lib/python3.6/site- 
 packages/django/urls/resolvers.py" in _reverse_with_prefix
  632.         raise NoReverseMatch(msg)

Exception Type: NoReverseMatch at /1/files/
Exception Value: Reverse for 'files' with arguments '('',)' not found. 1 
pattern(s) tried: ['(?P<dir_pk>[^/]+)\\/files\\/$']

urls.py:

from results import views

app_name = 'results'

urlpatterns = [
  path('', views.index, name='index'),
  path('<dir_pk>/files/', views.files, name='files'),
  path('results/<pk>/files/data/', views.data, name='data'),
]

views.py:

from django.shortcuts import render, HttpResponse, get_object_or_404, 
redirect

from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.contrib.auth.decorators import login_required

from ixLoad_app.ixiapi import create_results_dir_db
from results.models import Directory, Files, Data



def index(request):

  if request.POST.get('import'):
      print('I made it here')
      return redirect('results:index')
  else:
      result = Directory.objects.all()
      print('I am here')
      return render(request, 'results/index.html', context={'result': 
      result})


def files(request, dir_pk):
  directory = get_object_or_404(Directory, pk=dir_pk)
  #result = Files.objects.get(pk=pk)

  print('directory id :', dir_pk, directory)
  return render(request, 'results/results_files.html', context= 
  {'directory':directory})

models.py:

from django.db import models

class Directory(models.Model):

    name = models.CharField(max_length=100, default='foobar', unique=True)
    results_path = models.CharField(max_length=254, default='foobar', 
    null=True)
    date_field = models.DateField(max_length=100, default=None, null=True)

    class Meta:
        verbose_name_plural = 'directory'
        ordering = ['date_field']

    def __str__(self):
        return self.name

class Files(models.Model):

    csv_filename = models.CharField(max_length=100, default="foobar")
    directory = models.ForeignKey(Directory, on_delete=models.CASCADE, 
    related_name='files')

    class Meta:
        verbose_name_plural = 'files'
        ordering = ['csv_filename']

    def __str__(self):
        return self.csv_filename

index.html:

<!DOCTYPE html>
{% extends "base.html" %}


  {% block body_block %}
      <br>
      <h5>{{ info|cut:'passing' }}</h5><br>

      <div class="container">
          {% if result %}
            <form method="POST">
                {% csrf_token %}

                {% for hidden in form.hidden_fields %}
                    {{ hidden }}
                {% endfor %}

                <div class="mb-4">
                    <input type="submit" value="Update Results" 
                    name="update" id="update_submit" class="btn btn- 
                    primary">
                </div>
            </form>


            <table class="table table-hover">
              <thead class="thead-dark">
                  <tr>
                      <th scope="col">Date</th>
                      <th scope="col">ID</th>
                      <th scope="col"><div class="text-center">Results 
                       Directory</div></th>
                  </tr>
              </thead>
                {% for dir in result %}
                  <tbody>
                    <tr class="">
                      <td>{{ dir.date_field }}</td>
                        <td>{{ dir.id }}</td>
                        <td>
                            <a href="{% url 'results:files' dir.pk %}">
                                <div class="text-center">{{ dir.name }} 
                                </div>
                            </a>
                        </td>
                    </tr>
                  </tbody>
                {% endfor %}
            </table>
          {% else %}
            <form method="POST">
                {% csrf_token %}

                {% for hidden in form.hidden_fields %}
                    {{ hidden }}
                {% endfor %}

                <div class="mb-4">
                    <input type="submit" value="Import Results" 
                    name="import" id="import_submit" class="btn btn- 
                    primary">
                </div>
            </form>
          {% endif %}
      </div>
  {% endblock %}

results_files.html:

<!DOCTYPE html>
{% extends "base.html" %}


{% block breadcrumb %}
   <li class="breadcrumb-item"><a href="{% url 'results:index' %}">Results Directory</a></li>
  <li class="breadcrumb-item"><a href="{% url 'results:files' dir.pk %}">Result Files</a></li>
    <li class="breadcrumb-item active">{{ results.csv_filename }}</li>
{% endblock %}

{% block body_block %}

<div class="container">
    <table class="table table-hover">
      <thead class="thead-dark">
          <tr>
              <th scope="col">Directory</th>
              <th scope="col"><div class="">Files</div></th>
          </tr>
      </thead>

        {% for file in directory.files.all %}
          <tbody>
            <tr class="">
              <td>{{ file.directory.name }}</td>
                <td>
                    <a href="{% url 'data' file.pk %}">
                        <div class="">{{ file.csv_filename }}</div>
                    </a>
                </td>
            </tr>
          </tbody>
        {% endfor %}
    </table>

</div>

我浏览了许多相同的问题,但没有找到解决我问题的方法。我敢肯定这可能很简单,但是花了很多时间才可能有人看到我在做错事情。

1 个答案:

答案 0 :(得分:0)

在您看来,您写道:

def files(request, dir_pk):
  directory = get_object_or_404(Directory, pk=dir_pk)
  #result = Files.objects.get(pk=pk)

  print('directory id :', dir_pk, directory)
  return render(request, 'results/results_files.html', context= 
  {'directory':directory})

所以这意味着上下文包含一个directory变量,不是一个dir变量。因此dir.pk不能在模板中处理,并且默认为模板引擎设置中的string_if_invalid(默认为'',空字符串)。 。由于dir.pk的字符串为空,因此无法找到相关的URL。因此,我们应该改用directory.pk,最好在results_files.html中使用 named 参数:

<!DOCTYPE html>
{% extends "base.html" %}


{% block breadcrumb %}
   <li class="breadcrumb-item"><a href="{% url 'results:index' %}">Results Directory</a></li>
  <li class="breadcrumb-item"><a href="{% url 'results:files' dir_pk=directory.pk %}">Result Files</a></li>
    <li class="breadcrumb-item active">{{ results.csv_filename }}</li>
{% endblock %}

{% block body_block %}

<div class="container">
    <table class="table table-hover">
      <thead class="thead-dark">
          <tr>
              <th scope="col">Directory</th>
              <th scope="col"><div class="">Files</div></th>
          </tr>
      </thead>

        {% for file in directory.files.all %}
          <tbody>
            <tr class="">
              <td>{{ file.directory.name }}</td>
                <td>
                    <a href="{% url 'data' file.pk %}">
                        <div class="">{{ file.csv_filename }}</div>
                    </a>
                </td>
            </tr>
          </tbody>
        {% endfor %}
    </table>

</div>

我还建议您在网址格式中使用path converter [Django-doc]

# urls.py

from results import views

app_name = 'results'

urlpatterns = [
  path('', views.index, name='index'),
  path('<int:dir_pk>/files/', views.files, name='files'),
  path('results/<int:pk>/files/data/', views.data, name='data'),
]