Skip to main content
 首页 » 编程设计

python之(Django) DetailView 模板不显示信息

2024年09月07日25soundcode

在我的维护应用程序中,我有六个模型。我将只包括与这个问题相关的模型中的 2 个。有一个正确显示的设备列表( ListView )。但是,我在为每个设备创建 DetailView 时遇到问题。当我去 http://127.0.0.1:8000/maintenance/equipments/1它应该显示与设备 1 相关的所有设备实例(详细信息),但它会返回设备列表页面,即 http://127.0.0.1:8000/maintenance/equipments/ .

模型.py

from django.db import models 
 
class Equipment(models.Model): 
    """ 
    Model representing an Equipment (but not a specific type of equipment). 
    """ 
    title = models.CharField(max_length=200) 
    physicist = models.ForeignKey('Physicist', null=True, help_text= 'add information about the physicist') 
    technician = models.ForeignKey('Technician', null=True, help_text= 'add information about the technician') 
    # Physicist as a string rather than object because it hasn't been declared yet in the file. 
    features = models.TextField(max_length=1000, help_text='Enter a brief description of the features of the equipment') 
    machine_number = models.CharField('Number', max_length=30, null=True, help_text='Enter the Equipment number') 
    specialty = models.ForeignKey(Specialty, null=True, help_text='Select a specialty for an equipment') 
    # Specialty class has already been defined so we can specify the object above. 
    assigned_technician = models.CharField(max_length=50, null= True, blank=True) 
    #This is for the Technician who the repair of the Equipment is assigned to.  
 
    def __str__(self): 
 
        return self.title 
 
    def get_absolute_url(self): 
 
        return reverse('equipment-detail', args=[str(self.id)]) 
 
    def display_specialty(self): 
 
        return ', '.join([ specialty.name for specialty in self.specialty.all()[:3] ]) 
    display_specialty.short_description = 'Specialty' 
 
    class Meta: 
        ordering = ['-id'] 
 
class EquipmentInstance(models.Model): 
 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text="Unique ID for this particular equipment across the entire database") 
    equipment = models.ForeignKey('Equipment', on_delete=models.SET_NULL, null=True)  
    imprint = models.CharField(max_length=200) 
    due_date = models.DateField(null=True, blank=True) 
    delegate = models.ForeignKey('Physicist', on_delete=models.SET_NULL, null=True, blank=True) 
 
    def is_overdue(self): 
        if self.due_date and date.today() > self.due_date: 
            return True 
        return False 
 
    MAINTENANCE_STATUS = ( 
        ('p', 'Past Maintenance'), 
        ('o', 'On Maintenance'), 
        ('a', 'Available'), 
        ('r', 'Reserved'), 
    ) 
 
    status = models.CharField(max_length=1, choices = MAINTENANCE_STATUS, blank=True, default='m', help_text='Equipment availability') 
 
    class Meta: 
        ordering = ["due_date"] 
        permissions = (("can_mark_maintained", "Set equipment as maintained"),)  
 
    def __str__(self): 
        """ 
        String for representing the Model object 
        """ 
        return '{0} ({1})'.format(self.id,self.equipment.title) 

维护/urls.py

from django.conf.urls import url 
from qatrack.maintenance import views  
from qatrack.maintenance import models 
 
urlpatterns = [ 
 
    url(r'^$', views.MDashboard, name='m_dash'), 
    url(r'^equipments/$', views.EquipmentListView.as_view(), name='equipments'), 
    url(r'^equipment(?P<pk>\d+)/$', views.EquipmentDetailView.as_view(), name='equipment-detail'), 
 
] 

views.py

from django.shortcuts import render 
from django.views.generic import DetailView, ListView 
from qatrack.maintenance import models 
 
class EquipmentListView(ListView): 
    template_name = 'maintenance/equipment_list.html' 
 
    def get_queryset(self): 
        return models.Equipment.objects.all() 
 
    paginate_by = 10 
 
class EquipmentDetailView(DetailView): 
    model = models.Equipment 
    template_name = 'maintenance/equipment_detail.html' 
    context_object_name = 'equipment' 

equipment_list.html

{% extends "maintenance/m_base.html" %} 
 
{% block body %} 
 
 <div class="row"> 
     <div class="col-md-12"> 
        <div class="box"> 
 
          <h1>Equipment List</h1> 
 
          {% if equipment_list %} 
          <ul> 
              {% for equipment in equipment_list %} 
            <li> 
              <a href="{{ equipment.get_absolute_url }}">{{ equipment.title }}</a> ({{equipment.physicist}}, {{equipment.technician}}) 
            </li> 
              {% endfor %} 
          </ul> 
          {% else %} 
              <p>There are no equipments in the database.</p> 
 
          {% endif %} 
        </div> 
      </div> 
 </div> 
 
{% endblock body %} 

equipment_detail.html

{% extends "maintenance/m_base.html" %} 
 
{% block title %}Equipment Details{% endblock %} 
 
{% block body %} 
  <h1>Title: {{ equipment.title }}</h1> 
 
  <h2>Machine Detail</h2> 
 
  <p><strong>Physicist:</strong> <a href="">{{ equipment.physicist }}</a></p> <!-- physicist detail link not yet defined --> 
  <p><strong>Technician:</strong> <a href="">{{ equipment.technician }}</a></p> <!-- technician detail link not yet defined --> 
  <p><strong>Features:</strong> {{ equipment.features }}</p> 
  <p><strong>Machine_number:</strong> {{ equipment.machine_number }}</p>   
  <p><strong>Specialty:</strong> {% for specialty in equipment.specialty.all %} {{ specialty }}{% if not forloop.last %}, {% endif %}{% endfor %}</p>   
 
    {% for type in equipment.equipmentinstance_set.all %} 
    <hr> 
    <p class="{% if type.status == 'a' %}text-success{% elif type.status == 'm' %}text-danger{% else %}text-warning{% endif %}">{{ type.get_status_display }}</p> 
    {% if type.status != 'a' %}<p><strong>Due to be maintained:</strong> {{type.due_date}}</p>{% endif %} 
    <p><strong>Imprint:</strong> {{type.imprint}}</p> 
    <p class="text-muted"><strong>Id:</strong> {{type.id}}</p> 
    {% endfor %} 
 
  </div> 
 
{% endblock body %} 

urls.py

from django.conf import settings 
from django.conf.urls import include, url 
from django.conf.urls.static import static 
from django.views.generic.base import TemplateView, RedirectView 
from django.contrib.staticfiles.templatetags.staticfiles import static as static_url 
from django.contrib import admin 
from qatrack.maintenance.views import get_data 
admin.autodiscover() 
 
urlpatterns = [ 
 
    url(r'^$', TemplateView.as_view(template_name="homepage.html"), name="home"), 
 
    url(r'^accounts/', include('qatrack.accounts.urls')), 
    url(r'^qa/', include('qatrack.qa.urls')), 
    url(r'^servicelog/', include('qatrack.service_log.urls')), 
    url(r'^parts/', include('qatrack.parts.urls')), 
    url(r'^units/', include('qatrack.units.urls')), 
    url(r'^issues/', include('qatrack.issue_tracker.urls')), 
    url(r'^maintenance/', include('qatrack.maintenance.urls')), 
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

我已经在这里解决了很多与此类似的问题并应用了它们,但我仍然无法让 DetailView 工作。我真的很感激任何帮助。谢谢。进行更改后,我遇到了这个回溯错误

Internal Server Error: /maintenance/equipment1/ Traceback (most recent call last): File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/urls/base.py", line 77, in reverse extra, resolver = resolver.namespace_dict[ns] KeyError: 'equipments'

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/core/handlers/exception.py", line 41, in inner response = get_response(request) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/core/handlers/base.py", line 217, in _get_response response = self.process_exception_by_middleware(e, request) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/core/handlers/base.py", line 215, in _get_response response = response.render() File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/response.py", line 107, in render self.content = self.rendered_content File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/response.py", line 84, in rendered_content content = template.render(context, self._request) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/backends/django.py", line 66, in render return self.template.render(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/base.py", line 207, in render return self._render(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/test/utils.py", line 107, in instrumented_test_render return self.nodelist.render(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/base.py", line 990, in render bit = node.render_annotated(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/base.py", line 957, in render_annotated return self.render(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/loader_tags.py", line 177, in render return compiled_parent._render(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/test/utils.py", line 107, in instrumented_test_render return self.nodelist.render(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/base.py", line 990, in render bit = node.render_annotated(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/base.py", line 957, in render_annotated return self.render(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/loader_tags.py", line 177, in render return compiled_parent._render(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/test/utils.py", line 107, in instrumented_test_render return self.nodelist.render(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/base.py", line 990, in render bit = node.render_annotated(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/base.py", line 957, in render_annotated return self.render(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/loader_tags.py", line 72, in render result = block.nodelist.render(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/base.py", line 990, in render bit = node.render_annotated(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/base.py", line 957, in render_annotated return self.render(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/defaulttags.py", line 322, in render return nodelist.render(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/base.py", line 990, in render bit = node.render_annotated(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/base.py", line 957, in render_annotated return self.render(context) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/template/defaulttags.py", line 458, in render url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) File "/home/blesjoe1/venvs/qatrack3/lib/python3.5/site-packages/django/urls/base.py", line 87, in reverse raise NoReverseMatch("%s is not a registered namespace" % key) django.urls.exceptions.NoReverseMatch: 'equipments' is not a registered namespace [14/May/2018 16:05:33] "GET /maintenance/equipment1/ HTTP/1.1" 500 215728

请您参考如下方法:

您的url不正确

代替

 url(r'^equipment(?:/(?P<pk>\d+))?/$', views.EquipmentDetailView.as_view(), name="equipment_detail"), 

应该是:

url(r'^equipment/(?P<pk>\d+)/$', views.EquipmentDetailView.as_view(), name="equipment_detail"),