Issue
s和 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
只是让浏览器因为某种原因失去了这个对象。
我是不是把一对一的关系弄错了?
你用的是哪个版本的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
并导入一切。
应用程序名称和对象实例之间不匹配。
在这种情况下,应用程序、模块和模型对象的命名是不同的。例如--下面是 姜戈的教程:应用程序的名称应该是 polls
而模板子目录也应该是 polls/templates/polls
但在这种情况下,该应用程序被命名为类似的东西 polls_app
和模板的子目录,比如 polls_templates
. 任何其他命名不匹配的结果都是一样的。
我在尝试在django中运行测试时发现了这个问题--尽管其他所有的东西都能正常运行(除了这个特定的通用视图),但测试却出现了错误。在调查这个错误时,我发现了测试的问题 runner
码(见 此处 或 此处)和 loadTestsFromName
中。
所以我猜测django依赖于对象名(在上面的例子中--它搜索的是 polls
在 polls_templates
或类似的东西),但我找不到如何配置。试着用 pdb
由于我对django的源码了解的太深,所以我的测试也不是很好。
我创建了一个新的应用程序,所有的东西都用同样的名字,现在测试运行正常了,而且还有 SolutionView
所以,让所有的东西都用同一个名字来称呼,就解决了我的问题。
我猜想在django中也有一个类似的依赖名字的模块。url
这也是同样的道理。