在Django的createview中显示外键的关联值

时间:2019-01-09 06:32:27

标签: django python-3.x django-models

我有两个模型:storeclaim,其中storeclaim的外键。我正在使用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 

我在前端看到的东西

enter image description here 我想显示store name而不是这些默认值。

1 个答案:

答案 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