Вопрос новичка Django относительно определения объекта с подобъектами из моделей для использования в шаблонах - PullRequest
1 голос
/ 21 сентября 2010

Я немного новичок в Django и искал несколько простых примеров создания объектов с подобъектами в представлениях, чтобы в шаблонах я мог иметь вложенные циклы.

Вот мой models.py для этого приложения ...

from django.db import models
from django import forms

class Market(models.Model):
    name   = models.CharField('Market name', max_length=150)
    state  = models.CharField('State', max_length=2)

    def __unicode__(self):
        return self.name

class Location(models.Model):
    name   = models.CharField('Location name', max_length=150)
    address1  = models.CharField('Address 1', max_length=200)
    address2  = models.CharField('Address 2', max_length=200,blank=True)
    city   = models.CharField('City', max_length=100)
    state   = models.CharField('State', max_length=2)
    zip_code = models.CharField('ZIP', max_length=10)
    phone  = models.CharField('Phone', max_length=20)
    hours  = models.TextField('Hours of operation', max_length=255)
    quote_text = models.TextField('Customer quote', max_length=500)
    quote_by = models.CharField('Customer name', max_length=30)
    yelp_url = models.URLField('Yelp URL', max_length=300,blank=True)
    image_store = models.ImageField('Storefront image', upload_to='images/locations', max_length=300,blank=True)
    image_staff = models.ImageField('Staff image', upload_to='images/locations', max_length=300,blank=True)
    market  = models.ForeignKey(Market, verbose_name='Regional market', null=True)

    def __unicode__(self):
        return self.name

Данные о рынках могут выглядеть следующим образом ...

id = 1
state = 'MO'
name = 'St. Louis - Central'

id = 2
state = 'MO'
name = 'St. Louis - West'

id = 3
state = 'IL'
name = 'Chicago - South'

id = 4
state = 'IL'
name = 'Chicago - North'

В моем views.py я хотел бы создать объект со списком / массивом сгруппированных состояний Рынка (по-разному) в порядке убывания, каждое из которых содержит подмассив отдельных имен Рынка в этом Состоянии для завершения вложенного forloop в шаблоне.

Язык шаблонов в Django действительно хорош тем, что не дает тонне логики находиться между html, который мне нравится. Но я все еще думаю о синтаксисе Python и необходимости создавать все объекты точно так, как они должны повторяться в шаблоне.

Вот как выглядит views.py ...

def locations_landing(request):
    marketList = Market.objects.values('state').order_by('-state').distinct()
    return render_to_response('locations.html', locals()) 

Как вернуть объект, чтобы мой шаблон мог выполнять следующие вложенные циклы ...

{% for st in stateList.all %}
    <h4>{{ st.state }}</h4>
    {% for mkt in stateList.marketList.all %}
        <p>* <a href="#">{{ mkt.name }}</a></p>
    {% endfor %}
{% endfor %}

Это приведет к тому, что следующее будет отображено в html на основе моих примеров данных выше ...

<h4>MO</h4>
<p>* St. Louis - Central</p>
<p>* St. Louis - West</p>
<h4>IL</h4>
<p>* Chicago - South</p>
<p>* Chicago - North</p>

Кстати, в приведенных выше примерах кода .PY нет ошибок, все хорошо, мне просто нужно несколько советов по правильному созданию объекта в представлении, чтобы шаблон помог.

1 Ответ

2 голосов
/ 21 сентября 2010

Я не вижу необходимости использовать distinct здесь. Представляя состояния в качестве отдельной модели и используя отношения, вы получите гораздо большую гибкость.

Я предлагаю вам создать третью State модель и использовать ForeignKey , чтобы связать модели вместе, чтобы каждый Market имел отношение один ко многим к одному State, я думаю, вам также нужна модель Location, связанная с моделью Market.

class State(models.Model):
    name   = models.CharField('State name', max_length=150)

class Market(models.Model):
    name   = models.CharField('Market name', max_length=150)
    state  = models.ForeignKeyField(State)

class Location(models.Model):
    state  = models.ForeignKeyField(Market)
    ...

По вашему мнению, все, что вам нужно сделать, это взять все состояния и передать их в шаблон:

def locations_landing(request):
    state_list = State.objects.all()
    return render_to_response('locations.html', {'state_list':state_list}) 

И, наконец, в вашем шаблоне итерируйте список состояний и используйте набор запросов обратное отношение , чтобы получить все рынки в этом состоянии:

{% for state in state_list %}
    <h4>{{ state }}</h4>
    {% for market in state.market_set.all %}
        <p>* <a href="#">{{ market }}</a></p>
        {% for location in market.location_set.all %}
           <p> {{ location }} </p>
        {% endfor %}
    {% endfor %}
{% endfor %}
...