【问题标题】:NoReverseMatch Error Related to get_context_data与 get_context_data 相关的 NoReverseMatch 错误
【发布时间】:2015-12-04 15:02:20
【问题描述】:

我的模板 url 标记导致 NoReverseMatch 错误。但我使用的是基于类的视图,错误与使用 get_context_data 函数有关。如果我注释掉 get_context_data 函数,我不会收到错误消息。

这是我得到的错误:

NoReverseMatch 在 /task-manager/update-project/e75eac16-711b-4fb7-9b08-7516cae8433f/

未找到带有参数“('',)”和关键字参数“{}”的“更新项目”的反向操作。尝试了 1 种模式:['task-manager/update-project/(?P[a-zA-Z0-9_-]+)/$']

然后: 模板渲染出错

在模板中 [projectdir]/[appdir]/templates/tasks

/update-project.html, error at line 7
Reverse for 'update-project' with arguments '('',)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['task-manager/update-project/(?P<pk>[a-zA-Z0-9_-]+)/$']

这里是update-project.html:

{% extends "tasks/base.html" %}

{% block content %}
<h2>Update a project</h2>

<div class="form">
<form action="{% url 'task_manager:update-project' project.id %}" method="POST">
    {% csrf_token %}
    {{ form }}
    <BR><BR>
    <input type="submit" value="Submit" />
</form>
</div>
....

我的应用程序的 urlconf 是 tasks/urls.py:

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

urlpatterns = [
    # Index
    url(r'^$', views.TaskView.as_view(), name='index'),

    # TASKS
    # E.g., /task/3j243o-Ofjdsof-3123
    url(r'^tasks/(?P<pk>[0-9a-zA-Z_-]+)/$', views.TaskDetailView.as_view(), name='task_detail'),
    # Adding tasks
    url(r'^add-task/$', views.TaskCreate.as_view(), name='add_task'),
    # Update/view tasks
    url(r'^view-task/(?P<pk>[0-9a-zA-Z_-]+)/$', views.TaskUpdate.as_view(), name='view_task'),

    # PROJECTS
    # E.g., /project/234jf0we-324skl-34j
    url(r'^projects/(?P<pk>[a-zA-Z0-9_-]+)/$', views.ProjectDetailView.as_view(), name='project_detail'),
    # Adding projects
    url(r'^add-project/$', views.ProjectCreate.as_view(), name='add_project'),
    # Updating/viewing Projects
    url(r'^update-project/(?P<pk>[a-zA-Z0-9_-]+)/$', views.ProjectUpdate.as_view(), name='update-project')
]

views.py的相关部分是:

class ProjectUpdate(UpdateView):
    """
    This will be used to view and update projects
    """
    template_name = 'tasks/update-project.html'
    model = Project
    context_object_name = 'project'
    fields = ['name','status', 'purpose', 'vision', 'big_steps', 'context', 'priority', 'due_date', 'related_project']

    def get_context_data(self, **kwargs):
        """
        This pulls in related tasks to display them as links.
        """
        # Call base implementation first to get a context
        context = super(ProjectUpdate, self).get_context_data(**kwargs)
        # TO DO: Add in querysets of related tasks
        context['related_tasks'] = Task.objects.all()

以及model.py的相关部分:

class Project(models.Model):
    """
    Project is for any multi-step thing that needs to be done. Tasks
    will be associated with it.
    """
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    name = models.CharField(max_length=200)

    purpose = models.TextField(blank=True)
    """What is my purpose with this task?"""

    vision = models.TextField(blank=True)
    """Vision refers to what the task will look like when successfully
    completed"""

    big_steps = models.TextField(blank=True)
    """What are the big steps (not task-level steps) that need to be
    completed? Maybe split this out into a new class, similar to tasks"""

    status = models.CharField(max_length=30, choices=STATUSES, default='pending')
    created_date = models.DateTimeField(auto_now_add=True)
    updated_date = models.DateTimeField(auto_now=True)
    context = models.CharField(max_length=50, choices=CONTEXTS)
    priority = models.CharField(max_length=50, choices=PRIORITIES)
    due_date = models.DateTimeField(blank=True, null=True)
    related_project = models.ForeignKey("self", blank=True, null=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('task_manager:project_detail', kwargs={'pk': self.pk})

奇怪的是,如果我在我看来注释掉 get_context_data 函数,它工作得很好。

【问题讨论】:

    标签: python django django-models django-templates django-views


    【解决方案1】:

    您似乎忘记了返回上下文。如果没有 return 语句,它会隐式返回 None。这会导致反向匹配,因为 url 标签获取的是 None 而不是所需的项目 id。

    def get_context_data(self, **kwargs):
        """
        This pulls in related tasks to display them as links.
        """
        # Call base implementation first to get a context
        context = super(ProjectUpdate, self).get_context_data(**kwargs)
        # TO DO: Add in querysets of related tasks
        context['related_tasks'] = Task.objects.all()
        return context
    

    【讨论】:

    • 这是你两天来回答的第二个愚蠢的问题。谢谢!
    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 2018-08-27
    • 2011-06-26
    • 2016-12-14
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多