我使用Django Admin构建管理站点。有两个表,一个是其中包含数据的ModelA
,另一个是其中不包含任何数据的ModelB
。如果b_b
中的一个模型字段ModelB
为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 admin更改(编辑)页面中具有默认值b_b(查看),它将数据关联到特定的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
“字段”是。它不是ModelB的实例。
如何获得ModelB实例?
最佳答案
您可以覆盖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
为空这一事实,则逻辑应放在模板中。假设上下文中的 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/