在提交后,如何使用传递给Django中URL的值手动填写表单字段?

时间:2019-07-10 11:14:57

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

我有这种形式,用户必须上传一个文件(收据),然后用外键连接该文件。我创建了一个简单的表格来接收文件,并且也可以正常工作。但是,我必须将该文件以及另一个模型的外键保存在数据库中。现在,我的模型只是将文件作为关系和外键。我的表单仅具有用于文件上传的字段,因为我显然不希望用户选择它应该是的外键。我希望外键自动用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,空)。

显然,我尝试传递的对象没有填充我的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 %}

在这里您可以看到我添加了print语句,它表明在我的终端中找到了ID为5的lr_object。

proof

1 个答案:

答案 0 :(得分:2)

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

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()