【问题标题】:Unable to create a many to many field for a new form in Django无法在 Django 中为新表单创建多对多字段
【发布时间】:2018-09-28 21:47:08
【问题描述】:

models.py-

class B(models.Model):
  filename = models.FileField(upload_to='files/')
  user = models.ForeignKey(User)
class A(models.Model):
  file = models.ManyToManyField(B, blank=True)

forms.py

class AForm(forms.ModelForm):
    file = forms.FileField(label='Select a file to upload', widget=forms.ClearableFileInput(attrs={'multiple': True}), required=False)
    class Meta:
        model = A
        fields = '__all__'

views.py-

if request.method == 'POST':
        a = A()
        form = AForm(request.POST, request.FILES, instance=a)
        if form.is_valid():
            a = form.save(commit=False)
            files = request.FILES.getlist('file')
            for f in files:
                fmodel = B(filename=f, user=request.user)
                fmodel.save()
                a.file.add(fmodel)
            a.save()

这会生成 505 错误,服务器日志将其显示为 OSError,错误位于 fmodel.save()。我认为 A 期望模型 B 已经存在 - 但不确定如何实现它。对这东西超级陌生。

【问题讨论】:

    标签: django django-models django-forms many-to-many


    【解决方案1】:

    您必须保存A 的实例添加B 的实例之前:

    if request.method == 'POST':
        a = A()
        form = AForm(request.POST, request.FILES, instance=a)
        if form.is_valid():
            a = form.save(commit=False)
            a.save()
            files = request.FILES.getlist('file')
            for f in files:
                fmodel = B(filename=f, user=request.user)
                fmodel.save()
                a.file.add(fmodel)
    

    【讨论】:

    • 嗨伊万,与这个问题无关,但你能帮我看看 request.POST 包含什么吗?不幸的是,在 python 中打印它不是一种选择。
    • 除了将request.POST 打印到控制台之外,我没有看到其他方法。
    • 嗨,Ivan,你能解释一下为什么我需要 form.save(commit=False) 和 contract.save()。试图绕过它,但没有成功
    • form.save(commit=False) 返回您在下面添加文件到ManyToManyField 所需的实例,如果不保存该实例,您将无法执行此操作。
    猜你喜欢
    • 2020-06-01
    • 2017-10-05
    • 2020-04-18
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2018-08-09
    相关资源
    最近更新 更多