首页 > 解决方案 > 如何在模板中更改 ManyToManyField 的视图?

问题描述

它很丑

我该怎么做才能看到这个领域的主体?必须有 Size 对象的值,但不能有“Size object (id)”

我有模型:

from django.db import models

class Good(models.Model):
    Name = models.CharField(max_length = 150)
    Size = models.ManyToManyField('Size')

    def _str_(self):
        return self.Name

class Size(models.Model):
    size = models.CharField(max_length = 150)

    def _str_(self):
        return self.size

这是我的forms.py

class GoodGet(forms.ModelForm):
    class Meta:
        model = Good_Get
        Size = forms.ModelChoiceField(queryset = Good.objects.all())
        fields = '__all__'

    def __init__(self, *args, good_id1=None, **kwargs):
        super(forms.ModelForm, self).__init__(*args, **kwargs)
        if good_id1 is not None:
            obj = Good.objects.filter(id = good_id1)
            for good in obj:
                good_sizes = good.Size.all()
            self.fields['Size'].queryset = good_sizes

所以,我希望用户从 Good 的尺码列表中选择尺码,但他看不到他选择的尺码。我想我需要对我的数据库做点什么,不是吗?

标签: django

解决方案


您应该在[Python-doc]中使用两个连续的下划线,而不是,例如:__str___str_

class Good(models.Model):
    Name = models.CharField(max_length=150)
    Size = models.ManyToManyField('Size')

    def __str__(self):
        return self.Name

class Size(models.Model):
    size = models.CharField(max_length=150)

    def __str__(self):
        return self.size

正如PEP-8 文档所说, “魔术对象”有两个连续的前导和尾随下划线:

__double_leading_and_trailing_underscore__: 存在于用户控制的命名空间中的“神奇”对象或属性。例如__init____import____file__。永远不要发明这样的名字;仅按记录使用它们。


推荐阅读