如何在django中解决这个问题而不改变模型?

问题描述 投票:0回答:1

资讯

  • 我在Django中有两个简单的模型,有一对一的关系。
  • 我使用的是通用视图
  • Issues和 Solutions数据库中的编号为1至10的 "S"。
  • 加载 Issue 经由 DetailView (如 localhost:8000/myapp/6/)效果很好

错误

当试图加载 Solution 在浏览器中查看(例如 localhost:8000/myapp/6/solution/),我得到的是 Page not found (404), No solution found matching the query.

编码

模型.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的通用视图文档对数据库进行Django查询 但我觉得我把这两者搞混了。

另外,用 pdb 只是让浏览器因为某种原因失去了这个对象。

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

python django python-3.x django-views django-generic-views
1个回答
0
投票

你用的是哪个版本的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 并导入一切。


0
投票

应用程序名称和对象实例之间不匹配。

在这种情况下,应用程序、模块和模型对象的命名是不同的。例如--下面是 姜戈的教程:应用程序的名称应该是 polls 而模板子目录也应该是 polls/templates/polls但在这种情况下,该应用程序被命名为类似的东西 polls_app 和模板的子目录,比如 polls_templates. 任何其他命名不匹配的结果都是一样的。

我在尝试在django中运行测试时发现了这个问题--尽管其他所有的东西都能正常运行(除了这个特定的通用视图),但测试却出现了错误。在调查这个错误时,我发现了测试的问题 runner 码(见 此处此处)和 loadTestsFromName 中。

所以我猜测django依赖于对象名(在上面的例子中--它搜索的是 pollspolls_templates 或类似的东西),但我找不到如何配置。试着用 pdb 由于我对django的源码了解的太深,所以我的测试也不是很好。

我创建了一个新的应用程序,所有的东西都用同样的名字,现在测试运行正常了,而且还有 SolutionView所以,让所有的东西都用同一个名字来称呼,就解决了我的问题。

我猜想在django中也有一个类似的依赖名字的模块。url 这也是同样的道理。

© www.soinside.com 2019 - 2024. All rights reserved.