我目前正在学习Django forms,我偶然发现了this post。
其中一个表单当前看起来如下所示:

我想要做的是将Category更改为formset,并能够在创建产品时渲染多个下拉列表。
我的models.py:
class Category(models.Model):
name = models.CharField(max_length=30)
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.name
class Product(models.Model):
name = models.CharField(max_length=30)
price = models.DecimalField(decimal_places=2, max_digits=10)
category = models.ForeignKey(Category, on_delete = models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.name我的forms.py:
class CategoryForm(forms.ModelForm):
class Meta:
model = Category
fields = ('name', )
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ('name', 'price', 'category', )
def __init__(self, user, *args, **kwargs):
super(ProductForm, self).__init__(*args, **kwargs)
self.fields['category'].queryset = Category.objects.filter(user=user)Views.py中的当前方法:
@login_required
def new_product(request):
if request.method == 'POST':
form = ProductForm(request.user, request.POST)
if form.is_valid():
product = form.save(commit=False)
product.user = request.user
product.save()
return redirect('products_list')
else:
form = ProductForm(request.user)
return render(request, 'products/product_form.html', {'form': form})products_form.html:
{% extends 'base.html' %}
{% block content %}
<h1>New product</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="save">
<a href="{% url 'products_list' %}">cancel</a>
</form>
{% endblock %}我尝试使用modelformset_factory并在views.py中更改方法,方法是创建一个CategoryFormSet,如下所示:
CategoryFormSet = modelformset_factory(Category, fields=('name', ), extra=2)
formset = CategoryFormSet(data=data, queryset=Category.objects.filter(user=request.user))然后用创建的表单集替换views.py中的原始表单。在html中,我只需将{{form}}替换为{{formset}}。在尝试了一段时间之后,我要么得到了只有一个提交按钮(没有呈现表单)的New product,要么得到了一个没有get error属性的User对象。我做错了什么?
发布于 2020-07-28 18:33:31
本教程的重点是允许用户添加/更新一个模型的多个实例。你想要编辑一个东西,多个相关的东西内联。
但是,您的数据模型只允许每个产品有一个类别,所以这没有任何意义。你是否希望每个产品有多个类别,这是只有你才能回答的问题:) -我假设你想要。
首先,您需要更改模型,以允许每个产品具有多个类别:
class Product(models.Model):
name = models.CharField(max_length=30)
price = models.DecimalField(decimal_places=2, max_digits=10)
categories = models.ManyToManyField(Category, related_name='products')
user = models.ForeignKey(User, on_delete=models.CASCADE)然后,您需要了解Inline Formsets。
如果你被困在这一点上,请带着具体的信息回来。
发布于 2020-07-28 18:10:55
而不是创建新的模型类别。你可以做到这一点。
CATEGORY_CHOICES= (
("1", "1"),
("2", "2"),
("3", "3"),
("4", "4"),
("5", "5"),
("6", "6"),
("7", "7"),
("8", "8"),
)
category = models.CharField(max_length = 20,choices = CATEGORY_CHOICES,default = '1')它将自动以HTML格式呈现。
https://stackoverflow.com/questions/63131691
复制相似问题