是否可以在 Django 中使用 CreateView 创建动态表单在运行时添加新字段?

问题描述

我正在构建一个表单,允许用户添加产品的不同功能,并且我还希望它是一个动态表单,以便用户可以将他想要的任何类别放入其中。类似的东西,

表格:

名称:衬衫

说明:...

类别 1:颜色:红色

类别 2:袖子:短

类别 3:...

添加新类别

保存

问题是我在这页面上使用了 CreateView 并且不知道如何将我的表单转换为动态表单。有没有办法做到这一点?还是用函数视图代替 CreateView 更好?

这是我的代码

查看:

class ProductCreateView(CreateView):
    template_name = "product_create.html"
    form_class = ProductModelForm
    queryset = Product.objects.all()

    def form_valid(self,form):
        return super().form_valid(form)

型号:

class Product(models.Model):
    title = models.CharField(max_length = 120)
    description = models.TextField()
    image = models.FileField(upload_to="products/images/")
    price = models.IntegerField()
    active = models.BooleanField(default = True)
    categorie = models.CharField(max_lenght = 50,default = '')

    def get_absolute_url(self):
        return reverse("products:product-detail",kwargs={"id": self.id})

    def delete(self,*args,**kwargs):
        self.image.delete()
        super().delete(*args,**kwargs)

形式:

class ProductModelForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = [
            'title','description','image','price','active','categorie'
            ]

先谢谢你!

解决方法

如果我理解正确的话,您想要做的是传递一些字段而不填写它们。如果是这种情况,基本上有两种方法。您可以覆盖不需要的字段,也可以覆盖表单类的初始化。

对于第一种情况:

class ProductModelForm(forms.ModelForm):
    title = forms.CharField(required=False)
    # ... follow this for all fields you want to be not required ...

    class Meta:
        model = Product
        fields = [
            'title','description','image','price','active','categorie'
            ]

对于第二种情况:

class ProductModelForm(forms.ModelForm):
    
    class Meta:
        model = Product
        fields = [
            'title','categorie'
            ]

    def __init__(self,*args,**kwargs):
        super(My_Form,self).__init__(*args,**kwargs)
        self.fields['title'].required = False
        # ... follow this for all fields you want to be not required ...

如果您的模型字段中有外键,则后一种解决方案会好得多,因为您不需要设置 qs 属性。

请注意您的模型中的字段应该同时为 blank=Truenull=True 以使这些解决方案起作用

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...