如何在Django Form中的Meta类中传递变量作为参数? [英] How to pass variable as argument in Meta class in Django Form?

查看:196
本文介绍了如何在Django Form中的Meta类中传递变量作为参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

forms.py

class MySelect(forms.Select):
    def __init__(self, *args, **kwargs):
        self.variations = kwargs.pop('variations')
        super(MySelect, self).__init__(*args, **kwargs)

    def render_option(self, selected_choices, option_value, option_label):
        return '<option whatever>...</option>'

class CartItemForm(forms.ModelForm):

    class Meta:
        model = CartItem
        fields = (
            'variation',
            'width',
            'height',
            'quantity',
        )
        widgets = {
            'variation': MySelect(variations=self.variation_query)
        }

    def __init__(self, *args, **kwargs):
        product = kwargs.pop('product')
        try:
            cart = kwargs.pop('cart')
            self.cart = cart
        except:
            pass

        super().__init__(*args, **kwargs)    
        variation_field = self.fields['variation']
        variation_field.queryset = Variation.objects.filter(
            product=product
        )
        self.variation_query = Variation.objects.filter(
            product=product
        )

    def save(self):
        cart_item = super().save(commit=False)
        cart_item.cart = self.cart
        cart_item.save()

        return cart_item

以下是您需要注意的地方。
Meta class)

Below is where you have to pay attention to. (in Meta class)

widgets = {
    'variation': MySelect(variations=self.variation_query)
}

code> self.variation_query 来自 __ init __

self.variation_query is from __init__.

这样做?

models.py

class CartItem(models.Model):
    cart = models.ForeignKey("Cart")
    variation = models.ForeignKey(Variation)
    # 벽화 너비
    width = models.PositiveIntegerField(
        default=1,
        validators=[MinValueValidator(1)],
    )


class Product(TimeStampedModel):
    name = models.CharField(max_length=120, unique=True)
    slug = models.SlugField(null=True, blank=True)
    description = models.TextField(max_length=400, blank=True)
    is_active = models.BooleanField(default=True)
    place_category = models.ForeignKey(
        "PlaceCategory",
        related_name="products_by_place",  # category.products_by_place.all()
    )
    subject_category_set = models.ManyToManyField(
        "SubjectCategory",
        related_name="products_by_subject",  # category.products_by_subject.all()
    )
        # 벽화 높이
        height = models.PositiveIntegerField(
            default=1,
            validators=[MinValueValidator(1)],
        )
        quantity = models.PositiveIntegerField(
            default=1,
            validators=[MinValueValidator(1)],
        )

class Variation(TimeStampedModel):
    COLOR_CHOICES = (
        ('black', '흑백'),
        ('single', '단색'),
        ('multi', '컬러'),
    )
    price = models.DecimalField(
        decimal_places=0,
        max_digits=15,
        blank=True,
        null=True,
    )
    product = models.ForeignKey(Product)
    color = models.CharField(
        max_length=10,
        choices=COLOR_CHOICES,
    )
    is_active = models.BooleanField(default=True)


推荐答案

你会在Meta做的事情您需要在 __ init __ 中执行整个操作。

That's not a thing you would do in Meta. You need to do the whole thing in __init__.

您已经在做这件事了,所以我不知道你为什么要覆盖Meta。

You're already doing that in fact, so I don't know why you want to override Meta at all.

这篇关于如何在Django Form中的Meta类中传递变量作为参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆