python - Django model field default based on another model field -
i use django admin build management site. there 2 tables, 1 modela
data in it, modelb
nothing in it. if 1 model field b_b
in modelb
none, can displayed on webpage value of modela
's field a_b
.
i don't know how it, here pseudo code:
in 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)
in admin.py
from django.contrib import admin .models import modela, modelb class modelbadmin(admin.modeladmin): fields = ['b_b'] list_display = ('b_b')
i think if b_b of modelb have default value of relative a_b value of modela, have default value of b_b(view) in django admin change(edit) page associate data particular modelb instance.
i want fill b_b in web page more easily.
i don't know whether requirement can achieved? or there way can achieve this?
i try custom templates filter following:
in 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 %}
in templatetags/drop_null.py
from django import template register = template.library() @register.filter(name='dropnull') def dropnull(cls): return cls.modela.a_b
the 'field' < django.contrib.admin.helpers.adminfield object @ 0x3cc3550> . not instance of modelb. how can modelb instance?
you can override save
method of modelb
model instead of providing default value:
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)
edit after clarification in comments
if want display value visitors want keep fact modelb.b_b
empty, logic should lay in template.
assuming view set objb
in context being modelb
object interested display, relevant part of template should like:
{% objb.b_b bvalue %} {% if not bvalue %} <p>{{ objb.modela.a_b }}</p> {% else %} <p>{{ bvalue }}</p> {% endif %} {% endwith %}
Comments
Post a Comment