【问题标题】:Django - Only update FileField column without overriding other columnsDjango - 只更新 FileField 列而不覆盖其他列
【发布时间】:2022-12-09 21:56:14
【问题描述】:

在 Django 中,我有一个模型:

class List(models.Model):
    item = models.CharField(max_length=200)
    document = models.FileField(upload_to='documents/', null=True, blank=True)

另外,我有一个页面只能将文件上传到清单文件现存的列表:

视图.py, 我有

def upload(request, item_id):
    if request.method == 'POST':
        item = List.objects.get(pk=item_id)
        form = ListForm(request.POST, request.FILES, instance=item)
        if form.is_valid():
            form.save()
            messages.success(request, 'File saved successfully.')
        else:
            messages.error(request, f'File not saved properly: {form.errors.as_data()}')
        return redirect('home')

.但是,由于表格不包括项目清单, 同时点击上传, 发生错误文件未正确保存:{'item': [ValidationError(['This field is required.'])]}.

最简单的方法可能是添加项目清单作为一个隐藏元素在 HTML 中:

<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <div class="row">
        <div class="col-md-10">
            <input type="file" class="form-control" name="document" />
        </div>
        <div class="col-md-2">
            <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Upload</button>
        </div>
    </div>
</form>

尽管如此,有没有更好的方法来克服这个问题?也许有任何选项可以跳过覆盖现有列?

谢谢!

【问题讨论】:

  • 你能告诉我你的 forms.py 和 ListForm 吗?也许问题就在那里。

标签: python django django-models django-views django-forms


【解决方案1】:

我已经了解了您的情况,但 save() 效果很好。以下是我测试的代码。你可以试试这个。

模型.py

from django.db import models

class List(models.Model):
    item = models.CharField(max_length=200)
    document = models.FileField(upload_to='documents/', null=True, blank=True)

表单.py

from django import forms
from .models import List

class ListForm(forms.ModelForm):
    class Meta:
        model = List
        fields = ['document']

视图.py

from django.shortcuts import render, redirect
from .models import List
from .forms import ListForm

# Create your views here.
def upload(request, item_id):
    if request.method == 'POST':
        item = List.objects.get(pk=item_id)
        form = ListForm(request.POST, request.FILES, instance=item)
        if form.is_valid():
            form.save()
            # messages.success(request, 'File saved successfully.')
        else:
            # messages.error(request, f'File not saved properly: {form.errors.as_data()}')
            pass
        return redirect('home')
    return render(request, 'templates/upload.html', {'form': ListForm()})

上传.html

<!-- both forms are working -->

<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{form}}
    <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Upload</button>
</form>

<hr/>

<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <div class="row">
        <div class="col-md-10">
            <input type="file" class="form-control" name="document" />
        </div>
        <div class="col-md-2">
            <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Upload</button>
        </div>
    </div>
</form>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-15
    • 2022-11-30
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多