2013-03-20 78 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) 

关于fieldsets;我所看到的是这样的,http://imgur.com/ubSBeB3。我只是无法排序为什么这些字段集会得到这些名称以及如何覆盖它们。

+0

这已经有一段时间了,在那段时间我已经取得了很多进展。我最坚持这最后一部分,并会感谢任何帮助。我已经将所有代码更新为我目前正在做的事情。我没有找到我理解的文档,它告诉我如何将属性添加到菜单节点。感谢您的帮助。 – TheHerk 2013-03-30 01:35:11

回答

0

我不能发表评论,所以我会尽力把它包装在这里。

你可以在模板中发布一些“你已经允许”的代码吗?我不确定我明白你的意思。

如果要上传图像槽django admin,您需要在您的models.py文件中有一个menu_image = models.ImageField(upload_to = '/images/')在您的班级中,并且要将其包含在模板中说<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 2013-03-21 16:28:37

+0

好的,所以,你可以有一个字段,因为我建议你在哪里上传图片,但是使它成为'menu_image = models.ImageField(upload_to ='/ images /',blank = True,null = True)'并且在模板中{%child.get_menu_icon}}'do'{%if menu_image%} /> {%else%} {%endif%}'如果您上传了它将被放置的图像,如果没有,其他代码将在模板中启用。 – Tamara 2013-03-21 20:25:02

+0

告诉我,这对你是否有意义,或者我还没有明白你的意思:) – Tamara 2013-03-21 20:26:24

1

查看菜单修饰符(https://django-cms.readthedocs.org/en/2.3.5/extending_cms/app_integration.html#navigation-modifiers),使用NavigationNode.attr属性,您应该可以添加任何自定义数据。

+0

非常感谢您的提示。我认为那是票。我尝试了几种不同的方法来实现它。这似乎是最合乎逻辑的,尽管我无法获得任何工作。我无法弄清楚如何调用模型中的变量,但我无法弄清楚如何将每个变量绑定到特定节点。请看看上面的内容,让我知道你的想法。 – TheHerk 2013-04-01 01:58:11

+0

节点应该是什么? CMS页面还是其他?在节点对象中,您可以使用一些数据(在每个节点的'attr'属性中)获取正确的'MenuIconImage' /'MenuIconFontAwesome'。 AFAIK他们没有真正的文件记录,但你应该很容易地从代码中获得它们。 – yakky 2013-04-10 18:15:29

+0

那么如果我将一个像“icon-search”这样的字符串硬编码到node.menu_icon_font_awesome =“icon-search”中,我可以在模板中使用{{child.menu_icon_font_awesome}}。我无法弄清楚的是如何从每个页面获取实际的变量到menu.py中。 – TheHerk 2013-04-10 19:30:19

相关问题