@DennyD314

Как передать в представление slug первого объекта?

Всем привет!
Думаю, задача весьма тривиальна: нужно чтобы при переходе на страницу с меню автоматически выбирался первый пункт меню, подсвечивался как active и выводилась информация по нему.
Я реализовал такую логику:
  1. по чистому url (без именованного списка) перехожу на страницу
  2. Slug принимает по умолчанию значение None
  3. В представлении проверяется, равен ли Slug None, если да, то пытаемся взять первый объект из qs всех объектов
  4. Если удается, то передаем его в шаблон
  5. Если слаг не равен Нон, то передаем его и объект с этим слагом в шаблон
  6. В шаблоне, если слаг передан, то определяем активный пункт по нему, если нет то по forloop.counter




Мне кажется, что я чрезвычайно перемудрил с этой задачей и можно было сделать в разы проще.
urls.py:
url(r'^excursions$', views.excursions, name='excursions'),
    url(r'^excursions/(?P<slug>[\S]+)/$', views.excursions, name='excursions')


views.py:
def excursions(request, slug=None):
    list_of_excursions = models.Excursion.objects.all()
    if slug == None:
        try:
            start_value = models.Excursion.objects.all()[0]
        except IndexError:
            return render(request, 'ex/excursions.html', {'Error_message': 'Извините, тут пока ничего нет'})
        else:
            return render(request, 'ex/excursions.html', {'list_of_excursions': list_of_excursions, 'first': start_value})
    else:
        start_value = get_object_or_404(models.Excursion, slug=slug)
        return render(request, 'ex/excursions.html', {'list_of_excursions': list_of_excursions, 'first':start_value, 'slug': slug})


шаблон:
{% if Error_message %}
    <p>{{Error_message}}</p>
{% else %}
    <div class="col-lg-2 col-md-4 col-xs-12">
        <ul class="nav nav-pills nav-stacked" >
            {% if slug %}
                {% for ex in list_of_excursions %}
                    {% if ex.slug == slug %}
                        <li class="active"><a href="{% url 'ex:excursions' ex.slug %}">{{ex.name}}</a></li>
                    {% else %}
                        <li><a href="{% url 'ex:excursions' ex.slug %}">{{ex.name}}</a></li>
                    {% endif %}
                {% endfor %}
            {% else %}
                {% for ex in list_of_excursions %}
                    {% if forloop.counter == 1 %}
                        <li class="active"><a href="{% url 'ex:excursions' ex.slug %}">{{ex.name}}</a></li>
                    {% else %}
                        <li><a href="{% url 'ex:excursions' ex.slug %}">{{ex.name}}</a></li>
                    {% endif %}
                {% endfor %}
            {% endif %}
        </ul>
    </div>
    <div class="col-lg-10 col-md-8 col-xs-12">
        <div class="center_place">
            <h1>{{first.name}}</h1><br>
            <p>{{first.text| safe}}</p>
        </div>
    </div>
{% endif %}
  • Вопрос задан
  • 367 просмотров
Пригласить эксперта
Ответы на вопрос 1
sim3x
@sim3x
return render(request, 'ex/excursions.html', 
{'list_of_excursions': Excursion.objects.all() })


{% for ex in list_of_excursions %}
  {%  if forloop.first %}  
    первона
  {% endif %}

  <a href="{{ ex.get_absolute_url }}">ex.name</a>

{% else %}
  нифига нет екскурсий
{%endfor%}


r'^excursions$' надо со слешем на конце писать
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы