首页 > 解决方案 > 如何将视图中的参数传递到 django 中的 modelForm 中?

问题描述

我的目标是让用户上传文档,但我的程序会自动命名文档。本质上,从视图中我将名称传递到表单中,该名称被放置在我的文档模型的“描述”字段中。谢谢!

视图.py

def testing(request):
if request.method == 'POST':
    name = 'testing'
    form = DocumentForm(request.POST, request.FILES, description=name)
    if form.is_valid():
        form.save()
        return redirect('landing')
else:
    form = DocumentForm()
return render(request, 'testing.html', {
    'form': form
})

表格.py

class DocumentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
    description = kwargs.pop('description')
    super(DocumentForm,self).__init__(*args, **kwargs)
    self.fields['description'].initial = description

class Meta:
    model = Document
    fields = ('description', 'document', )

模型.py

class Document(models.Model):
    description = models.CharField(max_length=255, blank=True)
    document = models.FileField(upload_to='documents/')
    uploaded_at = models.DateTimeField(auto_now_add=True)

标签: pythondjangodjango-modelsdjango-forms

解决方案


从 ModelForm 更新新实例只需要修改视图中的保存。如果这不是您的意思,请告诉我,我应该能够提供进一步的帮助。

def testing(request):
    if request.method == 'POST':
        name = 'testing'
        form = DocumentForm(request.POST, request.FILES, description=name)
        if form.is_valid():
            # get instance but don't commit to database
            doc = form.save(commit=False)
            # do modifications to the instance here.
            doc.description = name
            # save the instance with all modifications
            doc.save()
            return redirect('landing')
    else:
        form = DocumentForm()
    return render(request, 'testing.html', {
        'form': form
    })

更新 1kwargs.pop("description")需要执行以下操作。正在发生的事情是,在您的 else 中,您创建了没有 description 关键字的表单。

class DocumentForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(DocumentForm,self).__init__(*args, **kwargs)
        if 'description' in kwargs:
            description = kwargs.pop('description')
            self.fields['description'].initial = description

    class Meta:
        model = Document
        fields = ('description', 'document', )

推荐阅读