Django中如何通过表单而非下拉选择框添加ManyToManyField属性
问题解答
现有代码问题梳理
- 模型定义笔误:Customer类的items多对多字段关联的模型名写了
Items(多了s),应该改为Item - 表单定义错误:ItemForm的Meta类指定的模型为
Installment,和你定义的Item模型不匹配 - 视图逻辑缺失:仅单独保存了Item和Customer实例,没有将新建的Item和当前客户建立多对多关联
- 上下文返回逻辑缺陷:POST请求表单校验失败时没有返回上下文,会导致模板报错
修正后代码
models.py
class Item(models.Model): name = models.CharField(max_length=255) datetime = models.DateTimeField(auto_now_add=True) amount = models.FloatField(default=0) remaining = models.FloatField(default=0) class Customer(models.Model): name = models.CharField(max_length=255) phone = models.CharField(max_length=11) items = models.ManyToManyField(Item) # 修正关联模型名
forms.py
class ItemForm(forms.ModelForm): class Meta: model = Item # 修正关联模型 fields = '__all__' class CustomerForm(forms.ModelForm): class Meta: model = Customer fields = '__all__'
views.py
def customer_create_view(request): if request.method == 'POST': form = CustomerForm(request.POST) item_form = ItemForm(request.POST) # 双表单都校验通过再执行保存 if form.is_valid() and item_form.is_valid(): # 先保存新的Item实例 new_item = item_form.save() # 保存Customer基础信息,暂不提交到数据库 customer = form.save(commit=False) customer.save() # 保存表单中已选择的原有Item的关联关系 form.save_m2m() # 新增本次创建的Item和当前客户的关联 customer.items.add(new_item) return redirect("/") else: form = CustomerForm() item_form = ItemForm() # 统一返回上下文,覆盖所有请求场景 context = { 'form': form, 'item_form': item_form } return render(request, 'customer/app.html', context)
模板适配要求
需将两个表单放在同一个<form>标签内提交,示例:
<form method="post"> {% csrf_token %} {{ form.as_p }} <h3>新增物品</h3> {{ item_form.as_p }} <button type="submit">保存</button> </form>
内容的提问来源于stack exchange,提问作者afi
相关产品推荐
相关产品推荐

