【问题标题】:How to manually fill a form field after being submitted using a value passed to the URL in Django?使用传递给 Django 中 URL 的值提交后如何手动填写表单字段?
【发布时间】:2019-07-10 11:14:57
【问题描述】:

我有这种形式,用户必须上传文件(收据),然后用外键连接该文件。我创建了一个接收文件的简单表单,它也运行良好。但是,我必须将该文件与另一个模型的外键一起保存在数据库中。现在我的模型只有文件作为关系和外键。我的表单只有文件上传字段,因为我显然不希望用户选择它应该是什么外键。我希望用 URL 中给定的值自动填充该外键。我这样调用函数:

href="{% url 'suppliers:model_form_upload' quiz.id %}"

我在哪里正确获取quiz.id

这是我的模型:

class Uploaded_pod(models.Model):
    document = models.FileField(upload_to='pods/')
    lr_connected = models.ForeignKey(LR, on_delete=models.CASCADE, related_name='lr_pod')

我尝试了什么

这是我的views.py函数:

def pod_upload (request, pk):
    lr_object = get_object_or_404(LR, id=pk)

    if request.method == 'POST':
        form = UploadPODform(request.POST, request.FILES)
        form.lr_connected = lr_object
        form.save()

        if form.is_valid():
            form.lr_connected = lr_object
            form.save()
            return redirect('home')
    else:
        form = UploadPODform()
        form.lr_connected = lr_object


    return render(request, 'classroom/suppliers/model_form_upload.html', {'form': form})

如您所见,我正在尝试用我刚刚使用 URL 中传递的 pk 值过滤的对象填充 form.lr_connected 部分。

这是我的表格:

class UploadPODform(forms.ModelForm):
    class Meta:
        model = Uploaded_pod
        fields = ('document',)

我还打印了对象lr_object,它工作得很好。但是,当我去页面上传文件时,它告诉我

“lr_connected_id”列中的空值违反非空约束 详细信息:失败行包含 (10, pods/csv_BET4hl8.svg, null)。

很明显,我的 lr_connected 字段没有被我试图传递的对象填充。

这可能吗?有没有更好的办法???

我按照guide 上传文件。这是使问题复杂化的原因吗?

这是我的 html 呈现到:

{% block content %}
    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Upload</button>


    </form>

    <p><a href="{% url 'home' %}">Return to home</a></p>
{% endblock %}

在这里您可以看到我添加了打印语句,它显示在我的终端中它找到了 ID 为 5 的 lr_object。

【问题讨论】:

    标签: python django django-models django-orm django-file-upload


    【解决方案1】:

    您需要将值分配给实例,而不是表单。

    if request.method == 'POST':
        form = UploadPODform(request.POST, request.FILES)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.lr_connected = lr_object
            obj.save()
    

    【讨论】:

    • 很抱歉,我遇到了同样的错误。 null value in column "lr_connected_id" violates not-null constraint DETAIL: Failing row contains (14, pods/postgres_public_django_migrations.csv, null). 我什至尝试将字段 lr_connected 添加到表单中,然后它只是呈现了一个带有一些对象的下拉列表。
    • 如果lr_object 是您在视图开始时获得的对象,这是不可能的。请显示完整的回溯(作为问题的编辑)。
    • 尝试在你的 html 中添加enctype="multipart/form-data" form 标签。
    • 您的屏幕截图显示您仍在尝试将表单保存在 is_valid 块之外。我不知道你为什么这样做。删除 is_valid 之前的这两行。
    猜你喜欢
    • 2022-01-24
    • 2023-03-21
    • 1970-01-01
    • 2011-06-08
    • 2012-05-21
    • 1970-01-01
    • 2014-04-05
    • 2012-08-13
    • 1970-01-01
    相关资源
    最近更新 更多