Найти - Пользователи
Полная версия: Создание меню
Начало » Django » Создание меню
1 2
zago
Здравствуйте.
Недавно решил освоить Django. Прочитал документацию и решил создать небольшой сайт. Создал модель Article и view для нее:
class ArticleListView(ListView):
	model = Article
class ArticleDetailView(DetailView):
	model = Article
Далее создал шаблоны для обеих вьюшек

для ListView
{% block sidebar %}
	<ul>
		{% for article in object_list %}
			<li><a href="{{article.get_absolute_url}}">{{article.title}}</a></li>
		{% endfor %}
	</ul>
{% endblock %}

и для DetailView
{% extends "base.html" %}
{% block content %}
	<h2>{{ article.title }}</h2>
	<p>{{ article.content }}</p>
{% endblock %}

В файле base.html я обратился к block content(контентная часть) и к block sidebar(меню). но у меня ничего не получилось. block content отображается а block sidebar. Искал в инете способы создания меню, находил разные модули и решения, но мне важно создать самому менюху для того, чтобы понимать работу Джанго. Помогите пожалуйста. Заранее спасибо.
FishHook
Я делаю условно так

{# menu.html #}
{% load custom_tags %}
<ul class="nav">
    <li {% menu_entry list %}><a href="{% url product_list %}">Список товаров</a></li>
    <li {% menu_entry add %}><a href="{% url product_add %}">Новый</a></li>
    <li {% menu_entry producer_list %}><a href="{% url producer_list %}" >Список поставщиков</a></li>
</ul>

# templatetags/custom_tags.py
@register.tag(name="menu_entry")
def menu_entry(parser, token):
    try:
        menu_item_name = token.split_contents()[1]
    except ValueError:
        raise template.TemplateSyntaxError("%r error" % token.contents.split()[0])
    return ContextMenuNode(menu_item_name)
class ContextMenuNode(template.Node):
    def __init__(self, menu_item_name):
        self.menu_item_name = menu_item_name
    def render(self, context):
        menu_entry = context["menu_entry"]
        if menu_entry == self.menu_item_name:
           return "class=active"
        return

#common/views.py
class MyBaseView(object):
    title = ''
    menu_entry = ''
    def get_context_data(self, **kwargs):
        context = super(MyBaseView, self).get_context_data(**kwargs)
        context["action_title"] = self.action_title
        context["menu_entry"] = self.menu_entry
        return context
    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated():
            return HttpResponseRedirect(reverse("login"))
        self.territory = request.user.territory_set.get()
        return  super(MyBaseView, self).dispatch(request, *args, **kwargs)


class ArticleDetailView(MyBaseView, DetailView):
	model = Article
        menu_entry = "list"
#base.html
.....
{% block menu %}
                {% include "templates/menu.html" %}
{% endblock %}
.....
zago
Спасибо большое. Сейчас буду разбираться. Но исходя из этого кода я понял, что пункты меню мы добавляем вручную. А нельзя ли сделать так, чтобы при создании новой статьи Article, появлялся автоматически пункт меню? Заранее спасибо.
FishHook
zago
чтобы при создании новой статьи Article, появлялся автоматически пункт меню
Я такого меню не понимаю
od-5
FishHook
тоже задаюсь вопросом грамотного создания меню.
Можешь привести не “условный” пример, если не трудно конечно?
zago
я тоже до сих пор разбираюсь, но у меня до сих пор ничего не получается.
FishHook
od-5
FishHookтоже задаюсь вопросом грамотного создания меню.Можешь привести не “условный” пример, если не трудно конечно?
приведенный пример вполне рабочий
ИМХО меню это такая индивидуальная вещь, почти интимная, что какое-то универсальное решение сделать не получится.
Вот, например, товарищ желает, чтобы в меню были статьи и меню росло по мере добавления статей. Я не понимаю такого меню. По мне, меню это что-то более-менее статичное, изменяющееся редко. как меню этого сайта, например. “Главная-Пользователи-Найти-Профиль-Выйти”. Может быть, можно захитрить такое меню, чтобы при добавлении тем оно менялось, но вот лично я смысла в таком меню не вижу.
inoks
zago
А нельзя ли сделать так, чтобы при создании новой статьи Article, появлялся автоматически пункт меню?

Принцип такой:
<ul class="nav">
{% for article in articles %}
<li><a href = '{(article.get_absolute_url }}'>{{artice}}</a></li>
{% endfor %}
</ul>

что конкретно не получается?
zago
У меня не получается отобразить этот список:
<ul class="nav">
{% for article in articles %}
<li><a href = '{(article.get_absolute_url }}'>{{artice}}</a></li>
{% endfor %}
</ul>

вот что я сделал:

models.py
from django.db import models
class Article(models.Model):
	title=models.CharField(max_length=255)
	content=models.TextField(max_length=10000)
	
	def __unicode__(self):
		return self.title
		
	def get_absolute_url(self):
		return "/article/%i/" %self.id
# Create your models here.

views.py
from article.models import Article
from django.views.generic import DetailView
from django.shortcuts import render_to_response
class ArticleDetailView(DetailView):
	model = Article
	
def menu(request):
	article_list=Article.objects.all()
	return render_to_response('article/menu.html', {'article_list':article_list})

urls.py
from django.conf.urls import patterns, include, url
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'zago.views.home', name='home'),
    # url(r'^zago/', include('zago.foo.urls')),
	url(r'^article/$', 'article.views.menu'),
	url(r'^article/', include('article.urls')),
    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
    # Uncomment the next line to enable the admin:  
	url(r'^admin/', include(admin.site.urls)),
)

article_detail.py
{% extends "index.html" %}
{% block content %}
	<h2>{{ article.title }}</h2>
	<p>{{ article.content }}</p>
{% endblock %}

menu.html
{% block sidebar %}
	<ul class="nav">
		{% for article in article_list %}
			<li><a href = '{{article.get_absolute_url}}'>{{article.title}}</a></li>
		{% endfor %}
	</ul>
{% endblock %}[s][/s]

index.html
<title>{{ article.title }}</title>
</style>
[s][/s]<body>
	<div id="left">
		{% block sidebar %}	{% endblock %}
	</div>
	<div id="content">
		{% block content %}	{% endblock %}
	</div>
</body>

если я обращаюсь по адресу “/article/”, мне рендерится список через menu.html, если я обращаюсь к DetailView списка (“/article/5”), я хотел бы чтобы генерился index.html. Он у меня и генерится, но только без block sidebar.

я наверное что-то принципиально не правильно делаю, а что не могу понять
inoks
Вам нужно для себя разобраться, какие в каждом конкретном урле используются шаблоны и какие в них передаются переменные.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB