2016-01-28 4 views
2

Я новичок в Django. Я пытаюсь отобразить данные из моей модели Project в моем представлении индекса, используя шаблон. Я изо всех сил старался структурировать это приложение, похожее на приложение опросов. Я не уверен, что я делаю неправильно. Я использую Python 2.7 и Джанго 1.8.6Как отобразить данные модели в шаблоне Django

Вот мой URL:

from django.conf.urls import url 

from . import views 

app_name = 'project' 
urlpatterns = [ 
    url(r'^$', views.IndexView.as_view(), name='index'), 
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'), 
] 

Вот моя модель:

import datetime 
from django.db import models 
from django.utils.encoding import python_2_unicode_compatible 
from django.contrib.auth.models import User 
from django.utils import timezone 


@python_2_unicode_compatible # only if you need to support Python 2 
class Contractor(models.Model): 
    #project 
    name = models.CharField(max_length=50) 
    address = models.CharField(max_length=100, blank=True) 
    phone = models.CharField(max_length=14, blank=True) 
    city = models.CharField(max_length=60, blank=True) 
    state = models.CharField(max_length=2, blank=True) 
    created_by = models.ForeignKey(User, related_name='Contractor_created_by') 
    created_date = models.DateTimeField() 
    modified_by = models.ForeignKey(User, related_name='Contractor_modified_by') 
    modified_date = models.DateTimeField() 

    def __str__(self): 
     return self.name 

@python_2_unicode_compatible # only if you need to support Python 2 
class Project(models.Model): 
    name = models.CharField(max_length=50) 
    jobNumber = models.CharField(max_length=8) 
    shopOut = models.DateTimeField(null=True) 
    shopIn = models.DateTimeField(null=True) 
    delivery = models.DateTimeField(null=True) 
    job1 = models.CharField(max_length=50, null=True) 
    job2 = models.CharField(max_length=50, null=True) 
    job3 = models.CharField(max_length=50, null=True) 
    contractor = models.ForeignKey(Contractor, on_delete=models.CASCADE, default=101) 
    created_by = models.ForeignKey(User, related_name='Project_created_by') 
    created_date = models.DateTimeField(auto_now_add=True) 
    modified_by = models.ForeignKey(User, related_name='Project_modified_by') 
    modified_date = models.DateTimeField(auto_now=True) 
    def __str__(self): 
     return self.name 
    def save(self, *args, **kwargs): 
     if not self.id: 
      self.created_by = User.objects.get(id=1) 
      self.modified_by = User.objects.get(id=1) 
      super(Project, self).save(*args, **kwargs) 
      year = datetime.datetime.now().year 
      self.jobNumber = '{}{:04d}'.format(year, self.id) 
     self.modified_by = User.objects.get(id=1) 
     super(Project, self).save(*args, **kwargs) 

Вот мое мнение:

from django.shortcuts import get_object_or_404, render 
from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 
from django.views import generic 
from django.utils import timezone 

from .models import Project 

# Create your views here. 
class IndexView(generic.ListView): 
    model = Project 
    template_name = 'project/index.html' 

    def get_queryset(self): 
     return Project.objects 

class DetailView(generic.DetailView): 
    model = Project 

. Шаблон:

{% load staticfiles %} 
<h1>Projects</h1> 
<ul> 
{% for projects in project.get_queryset %} 
    in for loop 
    <!-- <li><a href="{% url 'projects:detail' projects.id %}">{{ projects.name }}</a></li> --> 
    <li><a href="#">Test</a></li> 
{% endfor %} 

</ul> 
end of list 

Когда я иду на страницу я получаю h1 проект, пустой UL, и линию, которая говорит «конец списка»

ответ

1

В вашем get_queryset, вы должны вернуть Project.objects.all().

В шаблоне, вам не нужно делать project.get_queryset метод get_queryset вызывается для вас и значения передаются в шаблон, как object_list и <objectname>_list, наряду с другими параметрами. В вашем случае объект Project, поэтому должна быть переменная project_list также вместе с object_list.

Вы можете сделать:

{% for project in project_list %} 
    <li><a href="{% url 'projects:detail' project.id %}">{{ project.name }}</a></li> 
{% endfor %} 

Или:

{% for project in object_list %} 
    <li><a href="{% url 'projects:detail' project.id %}">{{ project.name }}</a></li> 
{% endfor %} 

Вы можете прочитать больше об этом здесь: https://docs.djangoproject.com/en/1.9/ref/class-based-views/generic-display/#listview

+0

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

+0

В дополнение к отвечу Шан Ван, я объяснил, как запрос выполняется в ListView и два возможных способа для перебора списка объектов. – masnun

+0

Спасибо! Хотел бы я спросить два дня назад. – user908759

0

Вы могли бы хотеть попробовать:

{% for project in object_list %} 
    <li><a href="{% url 'projects:detail' project.id %}">{{ project.name }}</a></li> 
{% endfor %} 

object_list является имя по умолчанию для запроса, если вы используете ListView, вы можете изменить его, указав context_object_name на ваш взгляд. Вот django doc about that.

0

Ваш запрос на запрос не возвращает запрос, установленный на минуту, в настоящее время его просто возвращает связанный менеджер. вы должны сделать это вернуть QuerySet ...

def get_queryset(self): 
    return Project.objects.all() # added all 
Смежные вопросы