Как установить значение по умолчанию для поля модели в другое поле модели

вот файл models.py

class album(TimeStampedModel):
    #album_artist = models.ForeignKey(artist, on_delete=models.CASCADE)
    album_name = models.CharField(max_length=100, default="New Album")
    #released_at = models.DateTimeField(blank=False, null=False)
    #price = models.DecimalField(
     #   max_digits=6, decimal_places=2, blank=False, null=False)
    #is_approved = models.BooleanField(
     #   default=False, blank=False)

    #def __str__(self):
    #    return self.album_name


class song(models.Model):
    name = models.CharField(max_length=100,blank=True,null=False)
    album = models.ForeignKey(album, on_delete=models.CASCADE,default=None)
    # image = models.ImageField(upload_to='images/', blank = False)
    # thumb = ProcessedImageField(upload_to = 'thumbs/', format='JPEG')
    # audio = models.FileField(
        # upload_to='audios/', validators=[FileExtensionValidator(['mp3', 'wav'])])
    # def __str__(self):
        # return self.name

Я хочу сделать так, чтобы значение по умолчанию названия песни было равно названию альбома, которое я выбираю с помощью альбома Foreignkey. (на странице панели администратора) помогите?

При условии, что имя песни установлено blank=True. Вы можете создать сигнал pre_save для установки имени.

...

from django.db.models.signals import pre_save
from django.dispatch import receiver

....

@receiver(pre_save, sender=Song)
def song_pre_save(sender, instance, **kwargs):
    if instance.name is None:
        album = Album.object.get(pk=instance.album)
        instance.name = album.album_name
  

Подробнее вы можете прочитать на сайте Django

Поскольку у вас album метод __str__ модели просто self.name это возможно, (иначе текст опции был бы неправильным) ...вы должны переопределить шаблон Change_form администратора Song's Admin

Вам нужно создать файл change_form.html по этому пути создайте все папки: templates/admin/{app_name}/song/change_form.html

  • {app_name} = имя папки, в которой находится файл model.py Сонга
  • .

change_form.html

  • Вы не можете переопределить просто add_form.html, поэтому я добавил if, чтобы пропустить поле, если оно уже имеет значение (для фактических форм изменения)
{% extends "admin/change_form.html" %}

{% block extrahead %}{{ block.super }}
<script src="{% url 'admin:jsi18n' %}"></script>
{{ media }}

<script>
  django.jQuery(function($) { // Use Django's included Jquery
    // Default form format `id_{fieldname}`
    $('#id_album').change(function(){
      if ($('#id_name').val() == ''){
        // $(this).val() would be pk, so we need to find the selected option and use it's text
        $('#id_name').val($(this).find('option:selected').text());
      };
    });
  });
</script>
{% endblock %}

Я не был уверен, какой блок я должен переопределить, поэтому я выбрал extrahead ... возможно, есть и лучше, но это единственный, который мне показался и имел смысл

Вернуться на верх