将当前User对象附加到Django表单

时间:2013-11-05 22:02:51

标签: python django forms

我正在开发一个应用程序,其中包含一个带有.txt fiels文件上传表单的部分。我想要上传文件的当前用户以及文件和文件名一起添加。目前,我可以在管理部分成功完成此操作,但我不能通过表单本身保存它。任何想法?

以下是模型:

class UploadedTextFile(models.Model):
file = models.FileField(upload_to="textfiles")
filename = models.CharField(max_length = 50)
username = models.ForeignKey(User, blank=True, null=True)


class UploadedTextFileForm(ModelForm):
    class Meta:
        model = UploadedTextFile
        fields = ['file', 'filename']

以下是我的观点:

def inputtest(request):

#response for file being submited
    if request.method == "POST":
        form = UploadedTextFileForm(request.POST)  
        if form.is_valid():
            new_form = form.save(commit=False)
            new_form.username = request.user
            new_form.save()


        return render(request, 'about.html')

    inputtest = UploadedTextFileForm()
    return render(request, 'failed.html', {'inputtest': inputtest})

    else:
        inputtest = UploadedTextFileForm()
        return render(request, 'inputtest.html', {'inputtest': inputtest})

这是我的HTML:

{% extends 'base.html' %}

{% block content %}
<form method="post">{% csrf_token %}
{{ inputtest.as_p }}
<input type="submit" value="Submit" />
</form>

{% endblock content %}

1 个答案:

答案 0 :(得分:2)

在视图中执行此操作(如您所示)是执行此操作的正确方法。很可能是因为您将username作为字段留在表单上而遇到问题,并且由于FK模型字段没有blank=True设置表单,因此需要提供字段。您应该在表单的Meta类中明确声明您要接受用户输入的子集字段。

class UploadedTextFileForm(ModelForm):                
    class Meta:                                       
        model = UploadedTextFile
        fields = ['file', 'filename']

我不确定为什么你在表单无效时呈现不同的模板,但不管你在上下文中没有提供表单对象。这意味着您永远不会看到表单检测到的任何错误,这可能是此代码发生的错误 - 您没有看到username未提供的错误。