0

我的模型为OfferWood和。并与M2M 领域相关。在 Django admin添加新的 Wood 记录时,我可以为SliceTecJointTec选择多个选项。没问题。当涉及到报价时,我需要显示来自选定的Wood记录woodSlice数据和woodJoint数据的选项。SliceTecJointTecWoodSliceTecJointTec

例如;

SliceTec 数据:Slicet A、Slicet B、Slicet C

JointTec 数据:Jointt A、Jointt B、Jointt C

木材数据:木材 A,(切片 A,切片 C),(Jointt B,Jointt C)

在选择Wood AOffer时,我需要显示Slicet ASlicet B选项。

class Offer(models.Model):
    name            = models.CharField(max_length=200, verbose_name='Adınız Soyadınız')
    phone           = models.BigIntegerField(verbose_name='Telefon Numaranız')
    email           = models.EmailField(verbose_name='E-mail Adresiniz')
    date            = models.DateTimeField(verbose_name='Teklif Tarihi')
    frontWood       = models.ForeignKey('Wood', on_delete=models.PROTECT)
    frontSlice      = models.CharField(max_length=200)
    frontJoint      = models.CharField(max_length=200)
    frontSupport    = models.ForeignKey('Support', on_delete=models.PROTECT)
    frontThick      = models.CharField(max_length=200)
    frontDimen      = models.CharField(max_length=200)
    frontFlow       = models.ForeignKey('Flow', on_delete=models.PROTECT)
    frontGlue       = models.ForeignKey('Glue', on_delete=models.PROTECT)
    class Meta:
        verbose_name        = 'Teklif Talebi'
        verbose_name_plural = 'Teklif Talepleri'
    def __str__(self):
        return self.name

class Wood(models.Model):
    woodName    = models.CharField(max_length=200, verbose_name='Ahşap Adı')
    woodCode    = models.CharField(max_length=50, verbose_name='Stok Kodu', blank=True, null=True)
    woodSlice   = models.ManyToManyField('SliceTec', verbose_name='Uygun Kesim Teknikleri')
    woodJoint   = models.ManyToManyField('JointTec', verbose_name='Uygun Ekleme Teknikleri')
    woodImage   = models.ImageField(verbose_name='Görsel', blank=True, null=True)
    woodPrice   = models.PositiveIntegerField(verbose_name='Fiyat Düzeyi', blank=True, null=True)
    woodDesc    = models.TextField(verbose_name='Açıklama', blank=True, null=True)
    class Meta:
        verbose_name        = 'Ahşap Türü'
        verbose_name_plural = 'Ahşap Türleri'
    def __str__(self):
        return self.woodName

class SliceTec(models.Model):
    sliceName   = models.CharField(max_length=200, verbose_name='Kesim Tekniği Adı')
    sliceImage  = models.ImageField(verbose_name='Görsel', blank=True, null=True)
    sliceDesc   = models.TextField(verbose_name='Açıklama', blank=True, null=True)
    class Meta:
        verbose_name        = 'Kesim Tekniği'
        verbose_name_plural = 'Kesim Teknikleri'
    def __str__(self):
            return self.sliceName

class JointTec(models.Model):
    jointName   = models.CharField(max_length=200, verbose_name='Ekleme Tekniği Adı')
    jointImage  = models.ImageField(verbose_name='Görsel', blank=True, null=True)
    jointDesc   = models.TextField(verbose_name='Açıklama', blank=True, null=True)
    class Meta:
        verbose_name        = 'Ekleme Tekniği'
        verbose_name_plural = 'Ekleme Teknikleri'
    def __str__(self):
            return self.jointName
4

2 回答 2

0

如果您正在制作单一表格,那么除非我遗漏了什么,否则没有办法做到这一点,因为您在渲染表格时不知道选择了哪种木材。

您可以尝试使用 javascript 在页面内实现逻辑

于 2019-05-02T22:55:59.157 回答
0

您可以使用以下代码更改管理员中的标签。

将此添加到您的 Wood 模型中:

def description(self):
    slice_names = ','.join(self.woodSlice.values_list('sliceName', flat=True))
    joint_names = ','.join(self.woodJoint.values_list('jointName', flat=True))
    return '{}, (), ()'.format(self.woodName, slice_names, joint_names)

然后在管理员中,您可以覆盖您的 OfferAdmin 的 ComponentForm

class OfferComponentForm(forms.ModelForm):
    class Meta:
        model = Offer
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super(OfferComponentForm, self).__init__(*args, **kwargs)

        id_dict = Wood.objects.in_bulk()
        current_choices = self.fields['frontWood'].choices
        new_choices = [(value, id_dict[value].description()) for value, label in current_choices]
        self.fields['frontWood'].choices = new_choices

@admin.register(Offer)
class OfferAdmin
    form = OfferComponentForm
    model = Offer
于 2019-05-03T13:55:24.097 回答