这里是开发的新尝试。
我正在尝试做一个项目,但我已经遇到了一些我不知道为什么不起作用的问题......我把我的代码并解释了......
网址.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 %}
DetailView 的更新
1。使用 pk 更改 url
最重要的是,您必须了解View - Template 和urls。
在您的网址中 - 您应该将要使用的参数传递给 grep 一个特定对象。它应该是唯一的,所以只需使用 pk(id)。 (或者您可以制作自己独特的 slug)
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
那么你的 url 将是.. test/1/ , test/2/.
2。改变观点
其实,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。
