Ошибка использования DjangoFramework в шаблоне - PullRequest
0 голосов
/ 10 мая 2018

новая попытка разработки здесь.

Я пытаюсь создать проект, и у меня уже есть некоторые проблемы, которые я не знаю, почему не работает ... Я поместил свой код и объяснил это ...

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  

View.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 %}

Models.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:

текстопрегунта не появляется ...

Спасибо всем

D ...

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Должно быть

{% 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 %}

UPDATE

Если вы хотите перечислить все ваши объекты модели, пожалуйста, используйте ListView.

1. Измените ваше мнение на ListView

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

Тогда вы можете использовать objects и lista как в tempalte.

2. Измени свой URL

Вам не нужно tipo в URL, если это просмотр списка.

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 в шаблонах.

Поскольку вы определяете lista в context_object_name: это означает, что ваш список объектов будет использоваться с lista в шаблоне. (вы можете использовать objects, потому что django ListView автоматически создаст для вас контекст)

{% for test in lista  %}

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

{% endfor %}

ОБНОВЛЕНИЕ для DetailView

1. Измените URL с помощью pk

Прежде всего, вы должны понимать о View - Template и urls.

В ваших URL - вы должны передавать params то, что вы хотите использовать для поиска вашего конкретного объекта. Он должен быть уникальным, поэтому просто используйте 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 (как вы можете видеть здесь-ccbv.co.kr ) он имеет метод get_object(). Если какой-либо url_kwargs определен на ваш взгляд, он использует pk для основного. Таким образом, он найдет как Pregunta.objects.get(id=self.kwargs.get(pk)), что берет от вашего urls.py.

Затем вы можете использовать свой объект в шаблоне, используя lista или object.

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

Вы НЕ ДОЛЖНЫ блокировать все объекты (на самом деле CANT), потому что DetailView в основном находит ваш объект из вашего kwargs (в этой ситуации pk).

Я настоятельно рекомендую прочитать django docs (CBV) и посмотреть ccbv.co.kr для понимания CBV или попробовать использовать FBV в django.

0 голосов
/ 10 мая 2018

По умолчанию Generic.DetailView ищет pk в параметрах URL, которые используются для поиска данных из вашей базы данных.В вашем случае вы используете tipo в качестве параметров URL.Итак, вам нужно переопределить настройки по умолчанию в вашем представлении.Ваш код должен выглядеть примерно так:

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

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

Теперь он будет искать tipo в вашем URL и принимать параметры для поиска в вашей базе данных.Подробнее об общих взглядах можно узнать по этой ссылке: https://ccbv.co.uk/projects/Django/1.10/django.views.generic.detail/DetailView/

0 голосов
/ 10 мая 2018

попробуйте переопределить метод 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 %}


...