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

2024-06-28 11:04:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Django Admin来建立一个管理站点。有两个表,一个是ModelA,另一个是{},里面没有数据。如果ModelB中的一个模型字段b_b为None,则它可以用ModelA的字段a_b的值显示在网页上。在

我不知道怎么做,下面是伪代码:

在模型.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)

在管理员py在

^{pr2}$

我想如果modelB的b_b的默认值是modelA的相对a_b值,那么在django admin change(edit)页面中,我有一个默认值b_b(View),该页面将数据与特定的modelB实例相关联。在

我想在网页中更容易地填充b。在

我不知道这个要求能否实现?或者有别的方法可以达到这个目的?在

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

在templates/admin/includes中/字段集.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中_空.py在

from django import template
register = template.Library()

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

“字段”是<;django.contrib.admin.助手.AdminField对象位于0x3cc3550>。它不是ModelB的实例。 如何获取ModelB实例?在


Tags: django实例pyfieldifadminmodelslength
2条回答

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

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对象,那么模板的相关部分应该如下所示:

^{pr2}$

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

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

相关问题 更多 >