【问题标题】:Get Table selection and File in same form POST以相同的形式获取表选择和文件 POST
【发布时间】:2017-03-16 21:19:35
【问题描述】:

我有一个 django 模板,其中包含一个 django_table2 表,并且还接受一个文件:

{% extends 'portal/base.html' %}
{% load render_table from django_tables2 %}
{% block title %}{{user.first_name }} {{ user.last_name }} Portal{% endblock %}

{% block content %}

    <input type=button value="Back" onClick="javascript:history.go(-1);">
    <h4>Currently registered vehicles:</h4>
    <div class='vehlist'>
        <form action="/loadlocndb/" method="POST">
            {% csrf_token %}
            {% render_table veh_list %}


            <h4> Location database .csv file</h4>
            <input type="file" name="myfile"><br/>
            <input type="submit" value="Submit" />
        </form>
    </div>
{% endblock %}

目前在POST 中传回的唯一内容是选中的表格复选框。我如何也将文件传回。

views.py

@login_required   
def locndb(request):
    # This is the basic user landing Page
    veh_list =VehicleTable(Vehicle.objects.filter(company__user=request.user))
    form = LocnDBForm()
    RequestConfig(request).configure(veh_list)
    return render(request, 'portal/locndb.html', {"veh_list": veh_list, "form": form})

@login_required   
def loadlocndb(request):


    if request.method == "POST":
        pks = request.POST.getlist("update")
        print pks
        selected_objects = Vehicle.objects.filter(pk__in=pks)

        vlist = []
        for i in selected_objects:
            vlist.append(i)

        return render(request, 'portal/loadlocndb.html',{"vlist":vlist})

forms.py

from django import forms
from django.contrib.auth.models import User
from portal.models import UserProfile, Vehicle

class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())

    class Meta:
        model = User
        fields = ('username', 'email', 'password')

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ('milkco', 'compName')

class LocnDBForm(forms.ModelForm):
    class Meta:
        model = Vehicle
        fields = ('vehid','locndb',)

车辆模型

class Vehicle(models.Model):
    vehid = models.CharField(max_length = 10)
    company = models.ForeignKey(UserProfile, default = 1)
    #depot = models.ForeignKey(Depot, default = 1)
    locndb = models.FileField(upload_to="optiload/", default= "setting.MEDIA_ROOT/locndb/LocnDB.csv")

    class Meta:
        db_table = "vehicle"

    def __unicode__(self):
        return self.vehid

更好的是如何阻止用户在不选择表中至少一个条目和文件的情况下停止处理。

谢谢

【问题讨论】:

    标签: python html django file-upload django-tables2


    【解决方案1】:

    我更新了你的loadlocndb 视图:

    @login_required   
    def loadlocndb(request):
    
    
    if request.method == "POST":
        pks = request.POST.getlist("update")
    
        myfile = request.FILES['form_field_name'].file
        print pks, myfile
    
        selected_objects = Vehicle.objects.filter(pk__in=pks)
    
        vlist = []
        for i in selected_objects:
            vlist.append(i)
    
        return render(request, 'portal/loadlocndb.html',{"vlist":vlist})
    

    我还没有测试过,但是这个:request.FILES['form_field_name'].file 将从您的表单中获取文件。只需将您的文件表单字段名称替换为'form_field_name'

    你能把你的代码放在你的 form.py 中吗?

    在您的模板中,您应该将&lt;form action="/loadlocndb/" method="POST"&gt; 替换为&lt;form action="/loadlocndb/" method="POST" enctype="multipart/form-data"&gt;

    来自documentation:请注意,如果请求方法为 POST 并且发布请求的 &lt;form&gt; 具有属性 enctype="multipart/form-data",则 request.FILES 将仅包含数据。否则,request.FILES 将为空。

    【讨论】:

    • 我添加了 forms.py 和模型类
    • 所以在你的情况下,你可以得到像 request.FILES['locndb'].file 这样的文件,
    • 并将 更改为 ,您尝试过任何更改吗?
    • 我在尝试上传文件时收到MultiValueDictKeyError: "'locndb'" 错误。
    • 我猜它对 locndb 字段感到困惑。尝试用 {{ form.locndb }} 替换
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2012-08-16
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 2012-02-05
    相关资源
    最近更新 更多