Django中表单未提供值时,如何将Song.name设为关联Album.name?
实现Song.name为空时自动关联Album.name的方案
需求说明
当提交Song的表单时,若Song.name字段为空,自动将其设置为关联Album的name字段值。
现有模型定义
class Album(TimeStampedModel): name = models.CharField(default='New Album' , max_length = 80) release_datetime = models.DateTimeField(blank = False) cost = models.DecimalField(blank = False, decimal_places = 2,max_digits = 15) artist = models.ForeignKey(Artist, on_delete=models.CASCADE) is_approved = models.BooleanField(default=False) def __str__(self): return (f"id: {self.id} \n name: {self.name} cost: {self.cost} \n approved : {self.is_approved}") class Song(models.Model): album = models.ForeignKey(Album, on_delete=models.CASCADE) name = models.CharField(blank = True , max_length = 80) image = models.ImageField(blank = False) thumbnail = ImageSpecField(format='JPEG')
你尝试的写法问题
你写的name = models.CharField(blank?album.name)不符合Django字段定义的语法,无法实现需求,以下是几种正确的实现方式:
方法一:重写Song模型的save方法
这是最直接的方式,在模型保存前检查name是否为空,为空则赋值为关联Album的name:
class Song(models.Model): album = models.ForeignKey(Album, on_delete=models.CASCADE) name = models.CharField(blank = True , max_length = 80) image = models.ImageField(blank = False) thumbnail = ImageSpecField(format='JPEG') def save(self, *args, **kwargs): # 如果name为空,设置为关联专辑的名称 if not self.name: self.name = self.album.name super().save(*args, **kwargs)
方法二:使用Django pre_save信号
如果不想修改模型的save方法,可以用pre_save信号在保存前处理字段赋值:
from django.db.models.signals import pre_save from django.dispatch import receiver @receiver(pre_save, sender=Song) def set_song_name_from_album(sender, instance, **kwargs): if not instance.name: instance.name = instance.album.name # 注意:需要在app的apps.py中注册信号,比如在ready方法中导入该信号函数
方法三:在表单层面处理
如果是通过表单提交数据,可以在表单的字段清洗方法中处理:
from django import forms from .models import Song class SongForm(forms.ModelForm): class Meta: model = Song fields = ['album', 'name', 'image'] def clean_name(self): name = self.cleaned_data.get('name') album = self.cleaned_data.get('album') if not name and album: return album.name return name
内容的提问来源于stack exchange,提问作者Abdullah Ahmad
相关产品推荐
相关产品推荐

