Django模型字段默认基于另一个模型字段

时间:2015-07-08 12:48:00

标签: python django django-admin

我使用Django Admin来构建管理站点。有两个表,一个是ModelA,其中包含数据,另一个是ModelB,其中没有任何内容。如果b_b中的一个模型字段ModelB为无,则它可以显示在网页上,其值为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 admin change(edit)页面中有一个默认值b_b(View),它将数据与特定的modelB实例相关联。

我想更轻松地在网页中填写b_b。

我不知道这个要求是否可以实现?或者还有另一种方法可以实现这个目标吗?

我尝试按以下方式自定义模板过滤器:

在templates / 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 %}

在templatetags / drop_null.py

from django import template
register = template.Library()

@register.filter(name='dropnull')
def dropnull(cls):
    return cls.modela.a_b

'field'是&lt; django.contrib.admin.helpers.AdminField对象位于0x3cc3550&gt; 。它不是ModelB的实例。 我怎样才能获得ModelB实例?

2 个答案:

答案 0 :(得分:1)

您可以覆盖save模型的modelB方法,而不是提供默认值:

class ModelB(models.Model):
    modela = models.OneToOneField(ModelA)
    b_b = models.CharField(max_length=6, choices=[(1, 'M'), (2, 'F')], blank=True)

    def save(self, *args, **kwargs):
        if not self.b_b:
            self.b_b = self.modela.a_b
        super(ModelB, self).save(*args, **kwargs)

在评论中澄清后编辑

如果您只想向访问者显示该值,但希望保留ModelB.b_b为空的事实,则逻辑应该位于模板中。

假设您在上下文中的视图集objB是您有兴趣显示的ModelB对象,模板的相关部分应如下所示:

{% with objB.b_b as bValue %}
{% if not bValue %}
    <p>{{ objB.modela.a_b }}</p>
{% else %}
    <p>{{ bValue }}</p>
{% endif %}
{% endwith %}

答案 1 :(得分:0)

您可以为管理员模板定义和注册一个自定义template filter

来自文档:https://docs.djangoproject.com/en/1.8/howto/custom-template-tags/