这里是开发人员的新尝试。
我正在尝试制作一个项目,但我已经遇到了一些我不知道为什么不起作用的问题...我放置了我的代码并解释了它...
url.py
app_name = 'opotest'
urlpatterns = [
url(r'^$', views.indexView, name='index'),
url(r'^inicio/$', views.ListaView.as_view(), name='inicio'),
url(r'^test/(?P<tipo>.+)/$', views.TestList.as_view(), name='test'),
url(r'^test/(?P<tipo>.+)/run/$',
views.TestDetail.as_view(), name='run'), # this one
查看.py
class TestDetail(generic.DetailView):
model = Pregunta
context_object_name = 'lista'
def get_queryset(self):
return Pregunta.objects.all()
HTML 模板
{% for test in lista %}
<br/>
<p>Pregunta: {{ pregunta.textopregunta }}</p>
{% endfor %}
模型.py
class Pregunta(models.Model):
id = models.AutoField(primary_key=True)
textopregunta = models.CharField('Texto pregunta', max_length=1000)
test = models.ForeignKey(Test, on_delete=models.CASCADE)
def __str__(self):
return self.textopregunta
这段代码应该给我带来一些我已经创建的“pregunta”,但它不起作用......你能告诉我我做错了什么吗? for Bring me
Pregunta:
textopregunta 没有出现...谢谢大家
D...
最佳答案
应该是
{% for test in lista %}
<br/>
<p>Pregunta: {{ test.textopregunta }}</p>
{% endfor %}
可以工作,
但无论如何,如果您想使用 Pregunta.objects.all()
,则必须使用 ListView
,而不是 DetailView
。像这样
class TestList(generic.ListView):
model = Pregunta
context_object_name = 'lista'
{% for test in lista %}
<br/>
<p>Pregunta: {{ test.textopregunta }}</p>
{% endfor %}
更新
如果您想列出所有模型对象,请使用ListView
。
1。将 View 更改为 ListView
class TestList(generic.ListView):
model = Pregunta
context_object_name = 'lista'
然后您可以在 tempalte 中使用 objects
和 lista
。
2。更改您的网址
如果是 ListView ,则 url 中不需要 tipo
。
urlpatterns = [
url(r'^$', views.indexView, name='index'),
url(r'^inicio/$', views.ListaView.as_view(), name='inicio'),
url(r'^test/(?P<tipo>.+)/$', views.TestList.as_view(), name='test'),
url(r'^test/run/$',
views.TestList.as_view(), name='run'), # this one
3。在模板中使用 objects
或 lista
。
因为您在 context_object_name
中定义了 lista
:这意味着您的对象列表将与模板中的 lista
一起使用。 (您可以使用objects
,因为django ListView
会自动为您创建上下文)
{% for test in lista %}
<br/>
<p>Pregunta: {{ test.textopregunta }}</p>
{% endfor %}
详细 View 更新
1。使用 pk 更改 url
最重要的是,您必须了解View
- Template
和url
。
在您的网址中 - 您应该传递您想要用来 grep 一个特定对象的参数。它应该是唯一的,所以只需使用pk
(id)。 (或者您可以制作自己独特的鼻涕虫)
url(r'^test/run/$',
views.TestList.as_view(), name='run'), # this one
# this is DetailView
url(r'^test/(?P<pk>\d+)/$',
views.TestDetail.as_view(), name='run'), # this one
那么你的网址将是..test/1/
、test/2/
。
2。更改 View
实际上,django CBV支持很多函数(方法),所以你不必处理更多,但很难理解。
class TestDetail(generic.DetailView):
model = Pregunta
context_object_name = 'lista'
当您不了解 DetailView
时,您就会感到困惑。
在 DetailView
中,(如您所见 here-ccbv.co.kr )它有 get_object()
方法。如果您的 View 中定义了任何url_kwargs
,它将使用pk
作为基本。因此它会发现类似 Pregunta.objects.get(id=self.kwargs.get(pk))
的内容来自您的 urls.py
。
然后您可以在模板中使用您的对象,使用lista
或object
。
<br/>
<p>Pregunta: {{ lista.textopregunta }}</p>
您不必 forloop 所有对象(实际上不能),因为 DetailView
基本上从您的 kwargs
中找到您的对象(在这种情况下,pk
)。
我强烈建议阅读 django 文档 (CBV) 并查看 ccbv.co.kr用于理解 CBV,或尝试在 django 中使用 FBV。
关于python - 在模板中使用 DjangoFramework 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50267803/