Skip to main content
 首页 » 编程设计

python之在模板中使用 Django 框架时出错

2024年08月16日31虾米姐

这里是开发的新尝试。

我正在尝试做一个项目,但我已经遇到了一些我不知道为什么不起作用的问题......我把我的代码并解释了......

网址.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。