Не можете использовать get_absolute_url Джанго в словаре словарей? - PullRequest
0 голосов
/ 24 августа 2009

У меня возникли проблемы с использованием get_absolute_url в шаблоне. Кажется, это работает нормально, если я просто передаю один из своих объектов магазина и говорю {{ store.get_absolute_url }}, но если мне нужно перебрать словарь магазинов и затем использовать функцию get_absolute_url, она ничего не возвращает. Именно то, что я делаю, ниже:

  class Store(EthicalObject):
            type = "Store"
            name = models.CharField(max_length=50)
            company = models.ForeignKey(Company, verbose_name="Company", null=True, blank=True)
            location = models.OneToOneField(Location, verbose_name="Location", null=True, blank=True)
            products = models.ManyToManyField('Product', related_name="%(class)s_related", db_table=u'ethicsdb_products_to_stores', blank=True)
            companies = models.ManyToManyField('Company', related_name="%(class)s_related", db_table=u'ethicsdb_companies_to_stores', blank=True)

            def get_absolute_url(self):
                    return ('store_details', [str(self.id)])

            get_absolute_url = models.permalink(get_absolute_url)

Это работает:

views.py:
def fetch_sidebar_data(shop_object):
        sidebar_modules = {}

        if shop_object.content_type.name == 'company':
                sidebar_modules['related_stores'] = shop_object.stores.all()
                sidebar_modules['related_products'] = shop_object.products.all()

        if shop_object.content_type.name == 'store':
                sidebar_modules['related_companies'] = shop_object.companies.all()
                sidebar_modules['related_products'] = shop_object.products.all()

        if shop_object.content_type.name == 'product':
                sidebar_modules['related_stores'] = shop_object.stores.all()
                sidebar_modules['related_companies'] = shop_object.companies.all()

        sidebar_modules['tags'] = shop_object.tags


        return sidebar_modules['related_stores'][1]

def company_details(request, company_id):
        company = get_object_or_404(Company, id=company_id)

        sidebar_modules = fetch_sidebar_data(company)

        return render_to_response('company/details.html', {'company': company, 'sidebar_modules': sidebar_modules}, context_instance=RequestContext(request))


template:

{% extends "base-onecol.html" %}

{% block page_div_extra_attr %}class="twocol"{% endblock %}

{% block sidebar_content %}
        <div id="sidebar-right">
        <h1>{{ sidebar_modules.name }}{{sidebar_modules.get_absolute_url }}</h1>
        </div>
{% endblock %}

Это не работает:

views.py:
def fetch_sidebar_data(shop_object):
        sidebar_modules = {}

        if shop_object.content_type.name == 'company':
                sidebar_modules['related_stores'] = shop_object.stores.all()
                sidebar_modules['related_products'] = shop_object.products.all()

    if shop_object.content_type.name == 'store':
            sidebar_modules['related_companies'] = shop_object.companies.all()
            sidebar_modules['related_products'] = shop_object.products.all()

    if shop_object.content_type.name == 'product':
            sidebar_modules['related_stores'] = shop_object.stores.all()
            sidebar_modules['related_companies'] = shop_object.companies.all()

    sidebar_modules['tags'] = shop_object.tags


    return sidebar_modules

template:

{% extends "base-onecol.html" %}

{% block page_div_extra_attr %}class="twocol"{% endblock %}

{% block sidebar_content %}
        <div id="sidebar-right">
        {% for module_name,module in sidebar_modules.items %}
                {% ifequal module_name "related_stores" %}
                        <h3>Sold Here</h3>
                        {% for related_store in module.values %}
                                <a href="{{ related_store.get_absolute_url }}">{{ related_store.name }}</a><br/>
                        {% endfor %}
                {% endifequal %}

                {% ifequal module_name "related_products" %}
                        <h3>Buy Local</h3>
                        {{ module }}<br/>
                {% endifequal %}

                {% ifequal module_name "related_companies" %}
                        <h3>
                        {{ module }}<br/>
                {% endifequal %}

                {% ifequal module_name "tags" %}
                        {{ module }}<br/>
                {% endifequal %}

        {% endfor %}
        </div>
{% endblock %}

Во втором я просто не получаю возврата от get_absolute_url. Я знаю, что это работает в других местах, когда я распечатываю это. Это ошибка Django, невозможность использования get_absolute_url в словаре словарей?

1 Ответ

4 голосов
/ 24 августа 2009

Ого, это был довольно запутанный вопрос.

Ваша проблема здесь: {% for related_store in module.values %}

module - это QuerySet. .values вызывает метод QuerySet, который возвращает словарь, содержащий значения полей для каждой строки. Словарь не имеет атрибута get_absolute_url, а get_absolute_url не является полем в модели.

Просто используйте {% for related_store in module %}, и вы будете иметь дело с реальными экземплярами модели, а не словарями, что означает, что {{ related_store.get_absolute_url }} будет работать нормально.

...