如何在不更改模型的情况下在 Django 中解决此问题?
How can I solve this issue in django without changing the models?
信息
- 我在 Django 中有两个简单的模型,具有一对一的关系
- 我使用的是通用视图
- 数据库中有
Issue
和Solutions
,编号为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 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
中有一个类似的依赖名称的模块,它做同样的事情。
信息
- 我在 Django 中有两个简单的模型,具有一对一的关系
- 我使用的是通用视图
- 数据库中有
Issue
和Solutions
,编号为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 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
中有一个类似的依赖名称的模块,它做同样的事情。