2013-03-20 2 views
0

я позволил, в моем шаблоне HTML, используя иконки либо с небольшим квадратным PNG или со стороны шрифт удивительный:Добавить поле на страницу администратор включить иконку для пункта меню

<a href="#"><i class="icon-search"></i>Search</a> // using font-awesome 
// or 
<a href="#"><img src="images/icons/search.png">Search</a> // using images 

В шаблоне Топ- menu.html, мне нужно, чтобы иметь возможность использовать следующее:

{{ child.menu_icon_font_awesome }} # in place of "icon-search" 
{{ child.menu_icon_image }} # in place of "images/icons/search.png" 

Как один получить эти переменные в узлах меню ребенка в меню?

Кроме того, как мне получить поля для работы в admin.py (что гораздо менее важно)?

Моей menu_icons приложения выглядит следующим образом:

# models.py 

from django.db import models 
from django.utils.translation import ugettext_lazy as _ 
from cms.models.pagemodel import Page 
from django.core.files.storage import FileSystemStorage 

class OverwriteStorage(FileSystemStorage): 
    """ 
    Deletes file of same name if exists. 
    """ 
    def _save(self, name, content): 
    if self.exists(name): 
     self.delete(name) 
    return super(OverwriteStorage, self)._save(name, content) 

    def get_available_name(self, name): 
    return name 

class MenuIconFontAwesome(models.Model): 
    """ 
    Defines Font Awesome Menu Icon 
    """ 
    page = models.ForeignKey(Page, 
          unique=True, 
          verbose_name=_("Page"), 
          editable=False) 
    menu_icon_font_awesome = models.CharField(max_length=48, 
              verbose_name="Font Awesome Menu Icon", 
              blank=True) 

class MenuIconImage(models.Model): 
    """ 
    Defines Image Menu Icon 
    """ 
    page = models.ForeignKey(Page, 
          unique=True, 
          verbose_name=_("Page"), 
          editable=False) 
    menu_icon_image = models.ImageField('Menu Icon Image', 
             upload_to = 'menu_icons/', 
             blank=True,null=True) 


# admin.py 
from models import MenuIconFontAwesome, MenuIconImage 
from cms.admin.pageadmin import PageAdmin 
from cms.models.pagemodel import Page 
from django.contrib import admin 

class MenuIconFontAwesomeAdmin(admin.TabularInline): 
    """ 
    Adds field for Font Awesome Menu Icon 
    """ 
    model = MenuIconFontAwesome 
    fieldsets = (
    ('Menu Icon with Font Awesome', { 
     'fields': ('menu_icon_font_awesome',), 
    }), 
) 

class MenuIconImageAdmin(admin.TabularInline): 
    """ 
    Adds field for Image Menu Icon 
    """ 
    model = MenuIconImage 
    fieldsets = (
    ('Menu Icon with Uploaded Image', { 
     'fields': ('menu_icon_image',), 
    }), 
) 

PageAdmin.inlines.append(MenuIconFontAwesomeAdmin) 
PageAdmin.inlines.append(MenuIconImageAdmin) 

admin.site.unregister(Page) 
admin.site.register(Page, PageAdmin) 


# views.py 
# this is the part I cannot figure out 

Вот дополнение, используя наконечник для навигации модификаторов. Он дает ошибку: «Тип объекта« MenuIconFontAwesome »не имеет атрибута« menu_icon_font_awesome »« Я уверен, что есть что-то очевидное, чего я не вижу.

from menus.base import Modifier 
from menus.menu_pool import menu_pool 
from models import MenuIconFontAwesome, MenuIconImage 

class MenuIconsMod(Modifier): 
    """ 
    Add Menu Icons to the menu nodes 
    """ 

    def modify(self, request, nodes, namespace, root_id, post_cut, breadcrumb): 
     if post_cut: 
      return nodes 
     for node in nodes: 
      node.menu_icon_font_awesome = MenuIconFontAwesome.menu_icon_font_awesome 
      node.menu_icon_image = MenuIconImage.menu_icon_image 
     return nodes 

menu_pool.register_modifier(MenuIconsMod) 

Что касается комплектов принадлежностей; то, что я вижу, выглядит так: http://imgur.com/ubSBeB3. Я просто не могу понять, почему эти поля имеют эти имена и как их переопределять.

+0

Это было какое-то время, и за это время я достиг большого прогресса. Я больше всего застрял в этой последней части и буду признателен за любую помощь. Я обновил весь код до того, что делаю сейчас. Я не нашел документацию, которая, как я понимаю, подсказывает, как добавлять атрибуты в узел меню. Спасибо за помощь. – TheHerk

ответ

0

Мне не разрешено комментировать, поэтому я постараюсь завершить его здесь.

Можете ли вы разместить код, который вы «допустили» в шаблоне? Я не уверен, что понимаю, что вы имеете в виду.

Для того, чтобы загрузить изображение через django admin, вам необходимо скачать menu_image = models.ImageField(upload_to = '/images/') в свой класс в вашем файле .sys файл, а также включить его в шаблон, указав <img src="{{ object.menu_image.url }}" alt="menu_image_description" />. И чем в admin.py написать

from django.contrib import admin 
from myproject.models import * 

class MYModelNameAdmin(admin.ModelAdmin): 

    list_display = ('name',) 


admin.site.register(MuModelName, MyModelNameAdmin) 

Что с купели? Можете ли вы изменить свой вопрос и включить шаблон, admin.py и models.py у вас есть до сих пор?

+0

Благодарим вас за помощь. Я не был достаточно ясен и отредактировал, чтобы дать более подробную информацию. – TheHerk

+0

Итак, у вас может быть поле, как я предложил, где вы загружаете изображение, но сделайте его 'menu_image = models.ImageField (upload_to = '/ images /', blank = True, null = True)' и в шаблоне где у вас есть '{{child.get_menu_icon}}' do '{% if menu_image%} /> {% else%} {% endif%}' так что если вы загрузили изображение будет помещено, если нет, в шаблоне будет включен другой код. – Tamara

+0

скажите мне, если это имеет смысл для вас, или я все еще не получаю вашу точку :) – Tamara

1

Посмотрите на модификаторы меню (https://django-cms.readthedocs.org/en/2.3.5/extending_cms/app_integration.html#navigation-modifiers), используя свойство NavigationNode.attr, вы сможете добавлять любые настроенные данные.

+0

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

+0

Какими должны быть узлы? Страницы CMS или еще? В узловом объекте у вас есть несколько данных (в атрибуте 'attr' каждого узла), которые вы можете использовать, получите правильное' MenuIconImage'/'MenuIconFontAwesome'. AFAIK они на самом деле не документированы, но вы должны легко получить их из кода. – yakky

+0

Ну, если я жестко задал строку типа «icon-search» в node.menu_icon_font_awesome = «icon-search», я могу использовать {{child.menu_icon_font_awesome}} в шаблоне. Я не могу понять, как получить фактическую переменную в menu.py с каждой страницы. – TheHerk

 Смежные вопросы

  • Нет связанных вопросов^_^