如何创建将显示两个模型字段的表单?

时间:2015-05-28 16:29:20

标签: python django

我有两种模式:

class Product(models.Model):
    name = models.CharField(verbose_name="name", max_length=40)
    cost = models.FloatField(verbose_name="price")

    def __unicode__(self):
        return self.name

class Shop(models.Model):
    product = models.ManyToManyField(Product)
    name = models.CharField(verbose_name="Nazwa", max_length=40)
    budget = models.FloatField(verbose_name="kwota")

    def __unicode__(self):
        return self.name

我创建了一个表单

代码:

class ShopForm(forms.ModelForm): 
        product = forms.ModelMultipleChoiceField(queryset = Product.objects.all(), widget=forms.CheckboxSelectMultiple(),required=True) 
        name = forms.CharField(max_length=15, label='Name')
        budget = forms.FloatField()

        class Meta: 
                model = Shop
                fields = ('product','name', 'budget')

enter image description here

看起来在这张照片上,我不知道我怎么能在产品名称旁边显示它们的价格?例如: 呵呵 - 12美元

现在我只有名字,我想从模型“产品”中获得成本,任何人都知道我该怎么办?

1 个答案:

答案 0 :(得分:0)

您可以通过不同方式解决此问题:

  • 在模型中的__unicode__方法中进行更改

    class Product(models.Model):
        ...
        def __unicode__(self):
            return u"{}({})".format(self.name, self.cost)
    
  • 覆盖表单

    中的init方法
     class ShopForm(forms.ModelForm):
         def __init__(self, *args, **kwargs):
             super(ShopForm, self).__init__(*args, **kwargs)
             self.fields['product'].label_from_instance = lambda obj: u"%s | %s" % (obj.name, obj.cost)
    
  • 创建自定义表单字段:

    from django.forms.models import ModelMultipleChoiceField
    
    class ProductModelChoiceField(ModelMultipleChoiceField):
    
        def label_from_instance(self, obj):
            return u"%s | %s" % (obj.name, obj.cost)