Django模型__str__返回非字符串(Bottle)报错的原因与修复
Django Admin操作Ingredient报错的修复方案
错误原因
你的Ingredient模型的__str__方法存在问题:当ingredient_rhum字段有值时,你直接返回了Bottle对象,而非字符串类型。尽管Bottle模型的__str__会返回字符串,但Django Admin的内部逻辑要求模型的__str__方法必须直接返回字符串,不能返回对象实例,这就导致了__str__ returned non-string (type Bottle)错误。
修复方法
修改Ingredient模型的__str__方法,确保无论哪种情况都返回字符串:
方案一:利用Bottle的__str__转换为字符串
class Ingredient(models.Model): drink = models.ForeignKey(DrinkRecipe, on_delete=models.CASCADE) ingredient_rhum = models.ForeignKey(Bottle, on_delete=models.CASCADE, null=True, blank=True) ingredient_name = models.CharField(max_length=255, blank=True) ingredient_amount = models.DecimalField(decimal_places=1,max_digits=5, validators=[MinValueValidator(0.01)]) def __str__(self): if self.ingredient_rhum: return str(self.ingredient_rhum) # 显式转换为字符串 return self.ingredient_name def get_absolute_url(self): return self.drink.get_absolute_url()
方案二:直接返回Bottle的名称字段
如果你想更直接地控制返回内容,可以直接调用Bottle的bottle_name字段:
def __str__(self): if self.ingredient_rhum: return self.ingredient_rhum.bottle_name return self.ingredient_name
为什么CreateView没有报错?
CreateView在渲染页面时,会隐式对对象调用str()进行转换,所以不会触发错误;但Admin的内部处理逻辑更严格,要求__str__方法必须直接返回字符串类型,因此暴露了这个问题。
内容的提问来源于stack exchange,提问作者Thomas Doll-Datema
相关产品推荐
相关产品推荐

