问题描述
我正在构建一个表单,允许用户添加产品的不同功能,并且我还希望它是一个动态表单,以便用户可以将他想要的任何类别放入其中。类似的东西,
表格:
名称:衬衫
说明:...
类别 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=True
和 null=True
以使这些解决方案起作用