我最近问了一个关于DetialViews和linkify的问题,但是意识到,问题不在于linkify,而是让细节视图显示出来。每当我试图让细节视图出现时,我都会收到“404错误”。如何让这个工作?我已经在这方面工作了一个星期,请帮忙。我不知道在哪里看。
这是urls.py网址模式:(我尝试了一堆不同的模式,无法让它工作。)
path('hospitals/', views.HospitalListView.as_view(), name='hospital_list'),
re_path(r'^hospitals/(?P<pk>\d+)$', views.HospitalDetailView.as_view(), name='hospital_detail')
这是我的views.py:
class HospitalListView(generic.ListView):
model = Hospital
context_object_name = 'hospital_list'
template_name = 'hospital_list.html'
class HospitalDetailView(generic.DetailView):
model = Hospital
def hospital_detail_view(request, primary_key):
hospital = get_object_or_404(Hospital, pk='primary_key')
return render(request, 'hospital_detail.html', {'hospital': hospital})
这是我的models.py。
class Hospital(models.Model):
"""Model representing Hospitals."""
name = models.CharField(max_length=200, primary_key=True)
hopid = models.UUIDField(default=uuid.uuid4, help_text='Unique ID for this particular hospital in database')
location_text = models.CharField(max_length = 800)
class Meta:
ordering = ['hopid']
def __str__(self):
"""String for representing the Model object."""
return f'{self.name} ({self.location_text})'
这是我的html文件 - hospital_list.html
{% extends "base_generic.html" %}
{% block content %}
<h1>Hospital List</h1>
{% if hospital_list %}
<ul>
{% for hospital in hospital_list %}
<li>
<a href="{% url 'hospital_detail' pk=hospital.pk %}">{{ hospital.name }}</a> ({{hospital.location_text}})
</li>
{% endfor %}
</ul>
{% else %}
<p>There are no hospitals listed in your area.</p>
{% endif %}
{% endblock %}
这是hospital_detail.html
{% extends "base_generic.html" %}
{% block content %}
<h1> Hospital Name: {{ hospital.name }}</h1>
<p><strong> Location: </strong>{{ hospital.location_text }}</p>
<p><strong> Phone Number:</strong> {{ hospital.phone }}</p>
<p><strong> Reviews: {{ hospital.reviews }</p>
{% endblock %}
已解决:感谢大家的帮助。我不知道出了什么问题。我做了一些事情并解决了它。
这解决了它。任何帮助理解为什么会很棒?
可能是因为你正在为pk分配一个字符串
class HospitalListView(generic.ListView):
model = Hospital
context_object_name = 'hospital_list'
template_name = 'hospital_list.html'
class HospitalDetailView(generic.DetailView):
model = Hospital
def hospital_detail_view(request, pk): # change here
hospital = get_object_or_404(Hospital, pk=pk) #oldone->pk='primary_key')
return render(request, 'hospital_detail.html', {'hospital': hospital})
也在网址中尝试:
path('hospitals/<int:pk>', views.HospitalDetailView.as_view(), name='hospital_detail')
即使这不起作用,请确保您在视图中收到pk值,我认为这是唯一的原因。尝试在url中打印pk值,以确保您正确接收它。
通用视图是为“不要重复自己”而构建的,请尝试下面的代码。
path('hospitals/<int:pk>/', views.HospitalDetailView.as_view(), name='hospital_detail')
class HospitalDetailView(generic.DetailView):
model = Hospital
template_name = "hospital_detail.html"
http://localhost:8000/hospitals/2/
在views.py中,
class HospitalDetailView(generic.DetailView):
model = Hospital
template_name = 'hospital_detail.html'
在模板中
{% extends "base_generic.html" %}
{% block content %}
<h1>Hospital List</h1>
<ul>
{% for hospital in hospital_list %}
<li>
<a href="{% url 'hospital_detail' hospital.pk %}">{{ hospital.name }}</a>
({{hospital.location_text}})
</li>
</ul>
{% empty %}
<p>There are no hospitals listed in your area.</p>
{% endfor %}
{% endblock %}
在urls.py中,
path('hospitals/<int:pk>/', views.HospitalDetailView.as_view(), name='hospital_detail')
这将解决您的问题。