如何在不更改模型的情况下在 Django 中解决此问题?

How can I solve this issue in django without changing the models?

信息

错误

尝试在浏览器中加载 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's docs on generic views and making Django queries to the database 但我认为我混淆了两者。

此外,使用 pdb 进行调试只会使浏览器由于某种原因丢失对象。

我是不是弄错了一对一关系?

您使用的是哪个 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 这也应该有效。

您必须将请求中的整数变量发送到基于 class 的视图 some_pk,这样 django 才能获得正确的对象。

page not found 也与您的模板路径有关 - 因此请检查它。

不要忘记正确设置 template_name 并导入所有内容。

应用名称与对象实例不匹配。

在这种情况下,应用程序、模块和模型对象的名称不同。例如 - 以下 django's tutorial:应用程序的名称应为 polls,模板子目录也应为 polls/templates/polls,但在这种情况下,应用程序的名称应为 [=12] =] 和类似 polls_templates 的模板子目录。任何其他命名不匹配的结果都是相同的。

我在 Django 中尝试 运行 测试时发现了这一点 - 尽管其他一切都有效(除了这个特定的通用视图),但测试失败并出现错误。调查该错误使我找到了测试 runner 代码(参见 here or here)和其中的 loadTestsFromName

所以我猜 django 依赖于对象名称(在上面的示例中 - 它在 polls_templates 中搜索 polls 或类似的东西),但我找不到这怎么可能被配置。尝试用 pdb 调试它也不是很好,因为我正在深入研究 django 的源代码。

我创建了一个新的应用程序,所有内容都同名,现在测试 运行 正常,SolutionView 也正常,所以让所有内容都同名解决了这个问题我.

我假设在 django 的 url 中有一个类似的依赖名称的模块,它做同样的事情。