Как я могу решить эту проблему в django, не меняя модели? - PullRequest
0 голосов
/ 03 мая 2020

Информация

  • У меня есть две простые модели в Django, с отношением один к одному
  • Я использую generi c views
  • В базе данных есть Issue s и Solutions s, пронумерованные от 1 до 10
  • Загрузка Issue через DetailView (например, localhost:8000/myapp/6/) прекрасно работает

Ошибка

При попытке загрузить представление Solution в браузере (например, localhost:8000/myapp/6/solution/), я получаю Page not found (404), No solution found matching the query.

Код

models.py :

class Issue(models.Model):
    def __str__(self):
        return self.issue_text
    issue_text = models.CharField(max_length=200)

class Solution(models.Model):
    def __str__(self):
        return self.solution_text
    issue = models.OneToOneField(Issue, on_delete=models.CASCADE)
    solution_text = models.CharField(max_length=200)

views.py :

class DetailView(generic.DetailView):
    model = Issue
    template_name = 'my_templates/detail.html'

class SolutionView(generic.DetailView):
    model = Solution
    template_name = 'my_templates/solution.html'

urls.py :

urlpatterns = [
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
    url(r'^(?P<pk>[0-9]+)/solution/$', views.SolutionView.as_view(), name='solution'),
]

Вопрос

Я подозреваю, что, возможно, отношения между моделями неверны - я вижу, что представление вызывает ошибку 404, потому что не может найти объект solution (хотя есть несколько solution объектов в базе данных для каждого Issue).

Я просматривал документы Django на generi c views и Django делает запросы к базе данных , но я думаю, что я путаю их.

Кроме того, отладка Использование pdb просто заставляет браузер потерять объект по какой-то причине.

Я неправильно понял отношение один-к-одному?

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Произошло несоответствие между именем приложения и экземпляром объекта.

В этом случае приложение, модуль и объекты модели были названы по-разному. Например - после django учебника : имя приложения должно быть polls, а подкаталог шаблонов также должен быть polls/templates/polls, но в этом случае приложение было названо примерно так: polls_app и подкаталог шаблонов что-то вроде polls_templates. Любое другое несоответствие имен приводит к тому же самому.

Я обнаружил это при попытке запустить тесты в django - даже если все остальное работало (кроме этого, указанного c, общий вид c), тесты провалились с ошибкой. Расследование этой ошибки привело меня к тестам runner код (см. здесь или здесь ) и loadTestsFromName в нем.

Так что я предполагаю, что django полагается на имя объекта (в примере выше - он искал polls в polls_templates или что-то подобное), но я не смог найти, как это можно настроить. Попытка отладить его с помощью pdb также не принесла пользы, так как я углублялся в исходный код django.

Я создал новое приложение, все названное так же, и теперь тесты работают нормально, а также SolutionView, так что все, что называется с тем же именем, решило вопрос для меня.

Я предполагаю, что в django 'url есть аналогичный модуль для проверки имен который делает то же самое.

0 голосов
/ 03 мая 2020

Какую Django версию вы использовали? попробуйте это ...

urls.py

urlpatterns = [
    path('solution/<int:pk>/', SolutionView.as_view(), name='solution'),
]

views.py

class SolutionView(DetailView):
    model = Solution
    template_name ="my_templates/solution.html"


    def get_object(self):
        some_pk = self.kwargs.get("pk")
        return get_object_or_404(Solution, pk=some_pk)

Протестировано. Это работает для меня нормально. Это django 3.0, но я предполагаю, что до версии 2.x это также должно работать.

Вы должны отправить целочисленную переменную из вашего запроса в представление на основе классов some_pk, чтобы django может получить нужный объект.

page not found относится также к пути вашего шаблона - поэтому проверьте его.

Не забудьте установить правильное значение template_name и импортировать все.

...