【问题标题】:User settings in django admindjango admin 中的用户设置
【发布时间】:2012-04-04 14:39:17
【问题描述】:

我希望能够从 django 管理员更改一些设置,例如:站点标题或页脚。我想拥有包含此设置的模型应用程序,但此设置应该是单个副本。最好的方法是什么?

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    您可以使用 @staff_member_required 装饰器创建一个视图,它会呈现/保存表单:

    from django.contrib.admin.views.decorators import staff_member_required
    ...
    @staff_member_required
    def edit_config(request, ):
        saved = False
        if request.method == "POST":
            form = ConfigForm(request.POST)
            if form.is_valid():
                ...
                # Do saving here
                saved = True
        else:
            form = ConfigForm()
            ...
        context = {
            'form': form,
            'saved': saved,
        }
        return render_to_response('staff/edit_config.html', context, context_instance=RequestContext(request))
    

    在视图中使用django forms,并将其传递给模板。

    然后,在模板中扩展“admin/base_site.html”,使您的表单具有管理员的外观和感觉。这是一个示例模板:

    {% extends 'admin/base_site.html' %}
    {% load i18n adminmedia %}
    
    {% block title %}Edit Configuration {{ block.super }} {% endblock %}
    
    {% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/forms.css" />{% endblock %}
    
    {% block breadcrumbs %}
        <div class="breadcrumbs">
            <a href="/admin/">{% trans "Home" %}</a> > Edit Configuration
        </div>
    {% endblock %}
    
    {% block content %}
        <h1>Edit Configuration</h1>
        {% if saved %}
            <p class="success" style="background-color:#9F9; padding: 10px; border: 1px dotted #999;">
                Settings were saved successfully!
            </p>
        {% endif %}
        <form method="POST" action="">
            {% csrf_token %}
            <fieldset class="module aligned">
                <h2>Configuration</h2>
                <div class="description"></div>
                {% for field in form %}
                    <div class="form-row {% if field.errors %}errors{% endif %}">
                        {{ field.errors }}
                        <div class="field-box">
                            {{ field.label }} : {{ field }}
                            {% if field.help_text %}
                                <p class="help">{{ field.help_text|safe }}</p>
                            {% endif %}
                        </div>
                    </div>
                {% endfor %}
            </fieldset>
            <div class="submit-row">
                <input type="submit" value="{% trans 'Save' %}" class="default" name="_save"/>
            </div>
        </form>
    {% endblock %}
    

    您可以使用数据库、ini 文件、redis 等来存储您的配置。您可以定义一些通用后端,并从中继承您的自定义后端,因此它很灵活。

    【讨论】:

      【解决方案2】:

      听起来像django-constance 会很合适。

      虽然django-flatblocks 可能就足够了。

      django-flatblocks 是一个简单的应用程序,用于处理小型 网站上的文本块。像 django.contrib.flatpages 一样思考它 不是针对整个页面,而是针对其中的一部分,例如 描述您可以在网站上执行的操作的信息文本。

      【讨论】:

      • 我不想使用第三方应用程序。我可以在没有第三方应用程序的情况下执行此操作吗?
      • 当然,您可以创建一个模型来保存您需要的数据,然后创建一个模板标签,在适当的位置呈现数据。但是,正如您已经指出此解决方案一样,您可能应该澄清您的确切问题/问题。话又说回来,在这种情况下,是什么让您无法使用第三方应用程序? Flatblocks 几乎可以满足您的需求,并且由于已经有人在使用它,您可以确定它考虑了您目前没有意识到的问题/方面。至少您可以查看它的来源,为您自己的解决方案汲取一些灵感。
      猜你喜欢
      • 2016-04-29
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      相关资源
      最近更新 更多