【发布时间】:2020-11-17 18:00:32
【问题描述】:
我目前正在学习 Django 表单,我遇到了this post。
其中一种形式目前如下所示:
我想做的是将类别更改为表单集,并能够在创建产品时呈现多个下拉列表。
我的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并通过创建一个CategoryFormSet来更改views.py中的方法:
CategoryFormSet = modelformset_factory(Category, fields=('name', ), extra=2)
formset = CategoryFormSet(data=data, queryset=Category.objects.filter(user=request.user))
然后将 views.py 中的原始表单替换为创建的表单集。在 html 中,我只需将 {{form}} 替换为 {{formset}}。在玩了一段时间之后,我要么只使用提交按钮(未呈现表单)获得新产品,要么用户对象没有属性 GET 错误。我做错了什么?
【问题讨论】:
标签: django django-forms django-views formset