【发布时间】:2015-09-26 09:29:08
【问题描述】:
我使用 Django Admin 来构建一个管理站点。有两张表,一张是ModelA,里面有数据,另一张是ModelB,里面什么都没有。如果ModelB中的一个模型字段b_b为None,则可以在网页上以ModelA的字段a_b的值显示。
不知道怎么弄,下面是伪代码:
在models.py中
from django.db import models
class ModelA(models.Model):
a_a = models.CharField(max_length=6)
a_b = models.CharField(max_length=6)
class ModelB(models.Model):
modela = models.OneToOneField(ModelA)
b_b = models.CharField(max_length=6, choices=[(1, 'M'), (2, 'F')], default=self.modela.a_b)
在 admin.py 中
from django.contrib import admin
from .models import ModelA, ModelB
class ModelBAdmin(admin.ModelAdmin):
fields = ['b_b']
list_display = ('b_b')
我认为如果 modelB 的 b_b 具有 modelA 的相对 a_b 值的默认值,我在 django 管理更改(编辑)页面中有一个默认值 b_b(View),它将数据关联到特定的 modelB 实例。
我想更轻松地在网页中填写 b_b。
不知道这个要求能不能达到?或者还有其他方法可以做到这一点?
我尝试自定义模板过滤器如下:
在模板/admin/includes/fieldset.html中
{% load drop_null %}
{% if field.is_checkbox %}
{{ field.field }}{{ field.label_tag }}
{% else %}
{{ field.label_tag }}
{% if field.is_readonly %}
<p>{{ field.contents }}</p>
{% else %}
{% if field.field.name == 'b_b' %}
{{ field|dropnull }}
{% else %}
{{ field.field }}
{% endif %}
{% endif %}
{% endif %}
在模板标签/drop_null.py 中
from django import template
register = template.Library()
@register.filter(name='dropnull')
def dropnull(cls):
return cls.modela.a_b
“字段”是
【问题讨论】:
-
我认为你真的需要重新评估你在这里想要达到的目标。 ModelA 会不会只有一行数据? self.modela 也不会像“self”一样工作,它是 ModelB 的实例。
-
当您说“它可以显示在...的网页上”时,您指的是哪个网页?用于创建新
modelB实例的管理表单或访问者将看到与特定modelB实例关联的数据的公共页面? -
我写了一个无法执行的伪代码。我希望 ModelB.b_b 有一个默认显示在管理页面上,管理员访问者将看到与特定 modelB 实例关联的数据。
标签: python django django-admin