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

Popular posts from this blog

toolbar - How to add link to user registration inside toobar in admin joomla 3 custom component -

linux - disk space limitation when creating war file -