2017-01-11 55 views
2

Я довольно новичок в Django, и я надеюсь, что смогу правильно сформулировать свой вопрос, поэтому, пожалуйста, расскажите со мной.Использование Django Logic для добавления CSS-класса на основе url с slug

То, что я прямо сейчас:

Простой персональный сайт с разделом блога. Когда я перехожу к другим элементам списка из панели навигации, он добавляет «активированный» класс, если li активен. Проблема возникает в разделе моего блога.

То, что я пытаюсь достичь:

Добавить «активированную» класс, когда я нахожусь в разделах блога и сообщений в блоге, так что ссылка будет активирована. Я использую slug для своих сообщений.

То, что я прямо сейчас, и он не работает:

template.html

<li class="{% if request.resolver_match.url_name == "index" %}activate{% endif %}"><a href='/'>Home</a></li> 
<li class="{% if request.resolver_match.url_name == "blog" %}activate{% endif %}"><a href='/blog/'>Blog</a></li> 
<li class="{% if request.resolver_match.url_name == "photohraphy" %}activate{% endif %}"><a href='/photography/'>Photography</a></li> 

models.py

from django.db import models 
from django.core.urlresolvers import reverse 

class Post(models.Model): 
    title = models.CharField(max_length=250) 
    slug = models.SlugField(max_length=250) 
    body = models.TextField() 
    date = models.DateTimeField() 
    updated = models.DateTimeField(auto_now=True) 

    def get_absolute_url(self): 
     return reverse('blog:post_detail', args=[self.slug]) 


    def __str__(self): 
     return self.title 

urls.py

from django.conf.urls import url, include 
from django.views.generic import ListView, DetailView 
from blog.models import Post 
from . import views 

urlpatterns = [ 
    url(r'^$', views.list_of_post, name='list_of_post'), 
    url(r'^(?P<slug>[-\w]+)/$', views.post_detail, name='post_detail') 

views.py

from django.shortcuts import render, get_object_or_404 
from .models import Post 

def list_of_post(request): 
    post = Post.objects.all() 
    template = 'blog/blog.html' 
    context = {'post': post} 
    return render(request, template, context) 

def post_detail(request, slug): 
    post = get_object_or_404(Post, slug=slug) 
    template = 'blog/post.html' 
    context = {'post': post} 
    return render(request, template, context) 

Я знаю, что я должен добавить дзиндзя логику в классе Li, но я понятия не имею, как установить его правильно. Я предполагаю, что это имеет какое-то отношение к get_absolute_url. Может ли кто-нибудь предложить вам способ сделать это просто и правильно?

Спасибо большое

+0

Исправьте 'urls.py', а также добавить' viewsy.py' если можно :) – opalczynski

+0

urls.py, кажется, работает правильно. Я не понимаю, что я должен исправить. Я добавил views.py. Благодаря! – IoanCosmin

+0

Я вижу, что urls.py на самом деле models.py - возможно, вы просто скопировали его два раза ... – opalczynski

ответ

0

Я предполагаю, что все страницы отображаются без Ajax вызовов. В этом случае на любой странице, которую вы просматриваете, вы можете просто передать имя страницы в контексте for eg. return self.render_to_response({'page': 'index'}), если ее выставляли по адресу index. Затем в шаблоне вы можете использовать простое условие if и установить активированный класс. Напр.

<li class="{% if page == "index" %}activate{% endif %}"><a href='/'>Home</a></li> 
 
<li class="{% if page == "blog" %}activate{% endif %}"><a href='/blog/'>Blog</a></li> 
 
<li class="{% if page == "photography" %}activate{% endif %}"><a href='/photography/'>Photography</a></li>

+0

Привет, Раджеш. Спасибо за решение. Не могли бы вы уточнить?Я не совсем понимаю, что мне нужно изменить, – IoanCosmin

+0

Посмотрите, когда вы нажимаете какую-либо ссылку в своем списке, запрос отправляется обратно, и есть обработанное представление. Теперь из этого конкретного вида вы можете отправить переменную обратно в шаблон, указав шаблон, на какой странице он находится. Далее в вашем шаблоне, где вы создали такое меню на основе 'li', вы можете ввести условие if, которое я продемонстрировал, чтобы проверить, соответствует ли переменная странице, на которую ссылается ссылка. Если да, добавьте класс активирован. Это оно. Итак, по вашему мнению, это указано '/ blog /' in return 'self.render_to_response ({'page': 'blog'})' –

+0

Я пробовал ваш метод, и он не работает. Ясно, что я делаю что-то неправильно. Не могли бы вы указать, что мне нужно изменить в моем коде, чтобы он работал? Спасибо! – IoanCosmin