2

我有以下模型:

class Campaign:
    ...


class Location:
    ...
    campaign = models.ForeignKey(Campaign)

我通常会使用表格内联编辑位置,但由于位置的数量非常多,我想将位置的管理移到另一个页面。它应该与普通的管理页面几乎一样,除了它应该只显示所选活动的位置,并且在添加新位置时,它应该自动附加到正确的活动。要访问位置管理页面,应单击活动列表中的链接。

这样做的正确方法是什么?还有其他选择吗?

4

1 回答 1

0

您的问题没有开箱即用的解决方案,但它很容易做到。

我会将 Locations 注册为一个单独的模型管理对象,如下所示:

from django.contrib import admin
from models import Location

class LocationAdmin(EnhancedModelAdminMixin, admin.ModelAdmin):
    list_filter = 'campaign', 

admin.site.register(Location, LocationAdmin)

这样,您将拥有管理界面,您可以在其中按广告系列过滤您的位置。

要直接访问 Campaign 模型管理员上的位置,我将使用https://github.com/charettes/django-admin-enhancer

在新位置创建表单上自动选择过滤的活动有点棘手......但我的方法是向添加新位置按钮添加一个查询参数,然后在初始化创建表单时捕获它,以定义字段活动的初始值.

首先在假设 your_app/admin/change_list.html 上创建一个模板,如下所示:

{% extends "admin/change_list.html" %}
{% load i18n admin_static admin_list %}
{% load admin_urls %}

{% block object-tools %}
  {% if has_add_permission %}
    <ul class="object-tools">
      {% block object-tools-items %}
        <li>
          <a href="{% url cl.opts|admin_urlname:'add' %}{% if is_popup %}?_popup=1{% if selected_campaign %}&selected_campaign={{ selected_campaign }}{% endif %}
          {% elif selected_campaign %}?selected_campaign={{ selected_campaign }}{% endif %}"
             class="addlink">
            {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
          </a>
        </li>
      {% endblock %}
    </ul>
  {% endif %}
{% endblock %}

然后附加您的 LocationAdmin 类,如下所示:

class LocationAdmin(EnhancedModelAdminMixin, admin.ModelAdmin):
    list_filter = 'campaign',
    list_display = 'location_name', 'campaign'

    change_list_template = 'your_app/admin/change_list.html'

    def changelist_view(self, request, extra_context=None):
        if 'campaign__id__exact' in getattr(request, request.method):
            selected_campaign = getattr(request, request.method)['campaign__id__exact']
            if not extra_context:
                extra_context = {'selected_campaign': selected_campaign}
            else:
                extra_context['selected_campaign'] = selected_campaign
        return super(LocationAdmin, self).changelist_view(request, extra_context)

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'campaign':
            if 'selected_campaign' in getattr(request, request.method):
                kwargs['initial'] = getattr(request, request.method)['selected_campaign']
                return db_field.formfield(**kwargs)
        return super(LocationAdmin, self).formfield_for_foreignkey(
            db_field, request, **kwargs
        )

所以我们在这里所做的是我们覆盖 modeladmins changelist_view 函数只是为了添加当前“selected_campaign”的额外上下文变量。

然后我们将其添加为添加新位置按钮上的查询参数。

最后,我们使用模型管理员 formfield_for_foreignkey 函数根据用户单击添加新位置时随请求收到的参数动态定义活动字段的初始值。

干杯! 如果您觉得它有帮助,请不要忘记对此答案进行投票;)

于 2013-08-27T15:21:58.543 回答