Как установить значение по умолчанию для поля модели в другое поле модели
вот файл 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
... возможно, есть и лучше, но это единственный, который мне показался и имел смысл