在temp中使用DjangoFramework时出错

2024-10-02 10:25:26 发布

您现在位置:Python中文网/ 问答频道 /正文

德夫的新尝试

我试图使一个项目,我总是有一些问题,我不知道为什么不工作。。。我把我的代码和解释

网址.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',我已经创造了,但它不工作。。。你能告诉我我做错了什么吗?“给我带来”

Pregunta:

文本“Pregunta”不会出现。。。

谢谢大家

D


Tags: 代码namepytestselfviewurlmodels
3条回答

默认情况下,Generic.DetailView在用于从数据库中搜索数据的url参数中查找pk。在本例中,您使用tipo作为url参数。因此,需要覆盖视图中的默认值。您的代码应该是这样的:

class TestDetail(generic.DetailView):
    model = Pregunta
    context_object_name = 'lista'
    pk_url_kwarg = 'tipo'

    def get_queryset(self):
        return Pregunta.objects.all()

现在会的 在url中查找tipo,并从数据库中获取要搜索的参数。有关泛型视图的更多信息,请访问以下链接:https://ccbv.co.uk/projects/Django/1.10/django.views.generic.detail/DetailView/

应该是

{% 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.将视图更改为ListView

class TestList(generic.ListView):
    model = Pregunta
    context_object_name = 'lista'

然后可以在tempalte中同时使用objectslista

2.更改url

如果是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.在模板中使用objectslista

因为您在context_object_name中定义了lista:这意味着您的对象列表将与模板中的lista一起使用(您可以使用objects因为django ListView会自动为您创建上下文)

{% for test in lista  %}

    <br/>
    <p>Pregunta: {{ test.textopregunta }}</p>

{% endfor %}

更新DetailView

1.用pk

最重要的是,您必须了解View-Templateurls

在你的网址-你应该传递参数你想用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  

那么您的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()方法。如果在视图中定义了任何url_kwargs,那么它将pk用作basic。所以它会发现从你的urls.py中得到的Pregunta.objects.get(id=self.kwargs.get(pk))

然后可以在模板中使用对象,使用listaobject

    <br/>
    <p>Pregunta: {{ lista.textopregunta }}</p>

你不必forloop所有的对象(实际上不能),因为DetailView基本上是从你的kwargs找到你的对象(在这种情况下,pk

我强烈建议阅读django文档(CBV)并查看ccbv.co.kr以了解CBV,或者尝试在django中使用FBV

尝试重写get_context_data()方法,如下所示,然后也更改模板,

class TestDetail(generic.DetailView):
    model = Pregunta
    context_object_name = 'lista'

    def get_queryset(self):
        return Pregunta.objects.all()

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['sample'] = self.get_queryset()
        return context

尝试按以下方式更改模板,

{% for test in sample  %}

    <br/>
    <p>Pregunta: {{ test.textopregunta }}</p>

{% endfor %}


相关问题 更多 >

    热门问题