我有两个模型:store
和claim
,其中store
是claim
的外键。我正在使用CreateView
通用视图。在前端的表单中,我可以看到store
的列表,就像username
+ Store
一样,但是我想在下拉列表中将商店的名称显示为选项的标签和ID中的值。
两个模型类似:
class Store(models.Model):
user = models.OneToOneField(Ext_User, on_delete=models.CASCADE)
store_name = models.CharField(max_length=50, default='', null=True, blank=True)
description = models.CharField(max_length=50, default='', null=True, blank=True)
....
class Claim(models.Model):
store = models.ForeignKey(Store, on_delete=models.CASCADE)
expense = models.DecimalField(max_digits=999, decimal_places=0)
customer = models.ForeignKey(Ext_User, on_delete=models.CASCADE)
....
创建声明的类别:
class ClaimCreateView(CreateView):
model = Claim
template_name = 'claim/claim_form.html'
fields = ['store', 'expense']
def form_valid(self, form):
form.instance.customer = self.request.user
return super().form_valid(form)
def test_func(self):
claim = self.get_object()
if self.request.user == claim.customer:
return True
return False
我在前端看到的东西
答案 0 :(得分:2)
您可以覆盖商店模型的__str__()
方法
每当我们尝试在Python中打印任何对象时,python都会内部调用它的__str__()
方法来获取该对象的字符串表示形式。
因此,如果要提供对象的自定义表示,可以覆盖默认的__str__()
。
对于商店模型,您甚至可以执行以下操作:
class Store(models.Model):
user = models.OneToOneField(Ext_User, on_delete=models.CASCADE)
store_name = models.CharField(max_length=50, default='', null=True, blank=True)
description = models.CharField(max_length=50, default='', null=True, blank=True)
def __str__(self):
return "%s owned by %s " % (self.store_name, self.user)
因此,每当您尝试打印任何Store
对象时,都会为该特定实例调用此__str__()
方法,并且将打印此方法返回的值,可以像{{ 1}}
参考:https://docs.djangoproject.com/en/2.1/ref/models/instances/#str