Подробное представление Django возвращает ошибку 404 (другие решения для работы со стеком не работают) - PullRequest
0 голосов
/ 15 февраля 2019

Я недавно задал вопрос о DetialViews и linkify, но понял, что проблема была не в linkify, а в том, чтобы показать подробный вид.Всякий раз, когда я пытаюсь отобразить подробный вид, я получаю «404 error».Как заставить это работать?Я буквально работал над этим в течение недели, пожалуйста, помогите.Я не знаю, где искать.

Вот шаблоны urls.py url: (Я пробовал несколько разных шаблонов и не могу заставить их работать.)

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 %}

РЕШЕНО: Спасибо всем за помощь.Я не знаю, что было не так.Я сделал несколько вещей, и это решило это.

  1. Я сменил основной ключ на название больницы, а не на uuid.Я просто назвал это первичным ключом.
  2. Я удалил свои базы данных и возобновил миграцию.

Это исправлено.Любая помощь в понимании, почему было бы здорово?

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

общие представления созданы для «Не повторяйся», попробуйте следующий код:

url

path('hospitals/<int:pk>/', views.HospitalDetailView.as_view(), name='hospital_detail')

view

class HospitalDetailView(generic.DetailView):
    model = Hospital
    template_name = "hospital_detail.html"

В браузере url exmaple т.е. pk= 2

http://localhost:8000/hospitals/2/
0 голосов
/ 15 февраля 2019

В 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')

Это решит вашу проблему.

0 голосов
/ 15 февраля 2019

Может быть, это потому, что вы назначаете 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})

также в URL, попробуйте:

path('hospitals/<int:pk>', views.HospitalDetailView.as_view(), name='hospital_detail')

, даже если это не сработало, убедитесь, что вы получаете значение pkпо-моему, это единственная причина для этого.попытайтесь напечатать значение pk в URL, чтобы знать, что вы получаете его правильно.

...