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

标签 python django django-admin

我使用 Django Admin 来构建一个管理站点。有两张表,一张是ModelA,里面有数据,另一张是ModelB,里面什么都没有。如果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)

在 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。

不知道这个要求能不能实现?或者有另一种方法可以实现这一点?

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

在 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

“字段”是 < django.contrib.admin.helpers.AdminField object at 0x3cc3550> 。它不是 ModelB 的实例。 如何获取 ModelB 实例?

最佳答案

您可以覆盖 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 为空的事实,则逻辑应该放在模板中。

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

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

关于python - Django模型字段默认基于另一个模型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31293204/

相关文章:

python - 异常值 :failed to find libmagic. 检查您在 Windows 7 中的安装

python - django admin 为计算字段启用排序

python - pandas to_numeric(…, downcast ='float' ) 失去精度

python - FunctionTransformer & 在管道中创建新列

python - 模块应该总是包含一个类吗?

python - 从 JSON 文件中删除重复条目 - BeautifulSoup

jquery - 将 jQuery 脚本添加到 Django 管理界面

django-allauth 返回错误 Reverse for 'account_confirm_email',参数为 '()',关键字参数为 '{}' 未找到

python - celery 任务中的翻译

python - Django 从模型中保存以前的对象