【问题标题】:How can I solve this issue in django without changing the models?如何在不更改模型的情况下在 django 中解决此问题?
【发布时间】:2020-08-17 09:21:43
【问题描述】:

信息

  • 我在 Django 中有两个简单的模型,具有一对一的关系
  • 我正在使用通用视图
  • 数据库中有Issues和Solutionss,编号从1到10
  • 通过DetailView(例如localhost:8000/myapp/6/)加载Issue 效果很好

错误

当尝试在浏览器中加载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 viewsmaking Django queries to the database,但我认为我混淆了这两者。

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

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

【问题讨论】:

    标签: python django python-3.x django-views django-generic-views


    【解决方案1】:

    您使用的是哪个 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 并导入所有内容。

    【讨论】:

    • 谢谢@black_hole_sun,我尝试了你的想法,但没有改变......当我运行服务器并转到解决方案 URL (.../[SOME_PK]/solution/) 我得到 django 的 404 (页面未找到/由:app.views.SolutionView 引发/没有解决方案与给定查询匹配)。你能解释一下这背后的逻辑吗?我的意思是,为什么用不同的 覆盖 get_object 会有帮助?
    • @somethingorange 更新了我上面的答案。如果您还有问题。请提供更多信息。回溯等
    • 我尝试了更新的答案:我仍然收到“找不到页面 (404)”错误(使用定义的 URLconf...Django 尝试了这些 URL 模式,按此顺序...当前路径 [PATH] 与其中任何一个都不匹配...您看到此错误是因为您有 DEBUG = True...)。对于 PATH 我尝试了几个 url 并稍微使用了 url 参数......所有结果都是 404 :|
    • 我想我弄错了模型关系...我的意思是,视图试图找到一个“解决方案”对象,但数据库中的一对一关系可能会失败?是否有可能没有与它尝试查询的 相关的“解决方案”对象? (我也会更新问题)
    • 嘿@black_hole_sun,我解决了我的问题——我猜它有一些命名问题,django 依赖于此。事实证明,在这种情况下,错误不会提供太多信息。非常感谢您提供帮助;)非常感谢
    【解决方案2】:

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

    在这种情况下,应用程序、模块和模型对象的名称不同。例如 - 在django's tutorial 之后:应用程序的名称应该是polls,并且模板子目录也应该是polls/templates/polls,但在这种情况下,应用程序被命名为polls_app 和模板子目录类似polls_templates。任何其他命名不匹配都会导致相同的结果。

    我在尝试在 django 中运行测试时发现了这一点——即使其他一切都正常(除了这个特定的通用视图),测试失败并出现错误。调查该错误使我找到了测试runner 代码(请参阅herehere)和其中的loadTestsFromName

    所以我猜想 django 依赖于对象名称(在上面的示例中 - 它在 polls_templates 或类似的东西中搜索 polls),但我找不到如何配置它。尝试使用 pdb 调试它也不是很好,因为我已经深入了解 django 的源代码。

    我创建了一个新应用程序,所有内容都命名相同,现在测试运行正常,还有 SolutionView,所以所有内容都使用相同名称解决了我的问题。

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

    【讨论】:

      猜你喜欢
      • 2017-05-23
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 2020-06-25
      • 2019-10-29
      • 2022-01-02
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多