【问题标题】:Django Uploading FilesDjango 上传文件
【发布时间】:2015-08-01 22:58:49
【问题描述】:

我有一个仪表板,您可以在其中上传文件,并且可以查看您上传的文件。奇怪的是,当您上传第二个文件时,它会上传但会出现错误:IntegrityError at /dashboard/ column client_id is not unique 我不知道为什么。我的数据库是新鲜和干净的。什么会导致这个?第一个文件上传并正确显示,将您重定向到仪表板。第二个文件上传,但未显示在文件列表中并显示该错误。任何想法为什么会发生这种情况或如何解决这个错误?我真的被困在这里,所以任何帮助都会为我节省很多时间。

这里是视图:

@login_required(login_url='/dashboard-login/')
def dashboard(request):
    current_user = request.user
    current_client = request.user.client

    files = ClientUpload.objects.filter(client=current_client)
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            new_file = ClientUpload(client=current_client, file_upload = request.FILES['file_upload'])
            new_file.save()

        return HttpResponsePermanentRedirect('/dashboard/')
    else:
        form = UploadFileForm()

    data = {'form': form, 'client': current_client, 'files': files}
    return render_to_response('dashboard.html', data, context_instance=RequestContext(request))

模型:

@python_2_unicode_compatible
class Client(models.Model):
    user = models.OneToOneField(User)
    company = models.CharField(max_length=100)

    def __str__(self):
        return self.company

    class Meta:
        verbose_name_plural = _("Clients")
        verbose_name = _("Client")
        permissions = (
            ("can_upload", _("Can upload files.")),
            ("can_access_uploads", _("Can access upload dashboard.")),
            ("is_client", _("Is a client.")),
        )

def generate_filename(self, filename):
    name = "uploads/%s/%s" % (self.client.company, filename)
    return name

@python_2_unicode_compatible
class ClientUpload(models.Model):

    client = models.OneToOneField(Client)
    created_at = models.DateTimeField(auto_now_add=True)

    file_upload = models.FileField(upload_to=generate_filename)

    def __str__(self):
        return self.client.company

    class Meta:
        verbose_name_plural = _("Client Uploads")
        verbose_name = _("Client Upload")

形式:

class UploadFileForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.add_input(Submit(_('submit'), _('Submit')))
        super(UploadFileForm, self).__init__(*args, **kwargs)

    class Meta:
        model = ClientUpload
        fields = ('file_upload',)

最后,模板:

上传文件:

{% load i18n %}
{% load crispy_forms_tags %}
{% crispy form %}

文件列表:

{% load i18n %}

<table class="table">
<tr>
    <th>{% blocktrans %}Filename{% endblocktrans %}</th>
    <th>{% blocktrans %}Size{% endblocktrans %}</th>
    <th>{% blocktrans %}Upload Time{% endblocktrans %}</th>
</tr>
{% for file in files %}
    {% with uploaded_file=file.file_upload %}  
 <tr>
    <th><a href='{{ uploaded_file.url }}'>{{ uploaded_file.name }}</a></th>
    <th>{{ uploaded_file.size }}</th>
    <th>Uploaded At</th>
    {% endwith %}
{% endfor %}
</tr>
</table>

以及将它们联系在一起的仪表板:

{% extends "base.html" %}
{% load i18n %}

{% block title %}Shenkan &amp; Associates - {% trans 'Dashboard' %}{% endblock title %}

{% block css %}
    {{ block.super }}
{% endblock css %}

{% block extra_css %}
{% endblock extra_css %}

{% block ie_shim %}
    {{ block.super }}
{% endblock ie_shim %}

{% block header %}
    {{ block.super }}
{% endblock header %}

{% block slider %}
{% endblock slider %}

{% block page_header %}{% endblock page_header %}

{% block content %}
    <!--=== Content ===-->
    <a href="{% url 'dashboard-logout' %}">{% trans 'Logout' %}</a>
    <div class="container content-md">
    {% include "upload_file.html" %}
    </div>
    <div class="container content-md">
    {% include "file_list.html" %}      
    </div>
    <!--=== End Content ===-->
{% endblock content %}

{% block footer %}
    {{ block.super }}
{% endblock footer %}

{% block js %}
    {{ block.super }}
{% endblock js  %}

{% block ie_js %}
    {{ block.super }}
{% endblock ie_js %}

{% block extra_js %}
{% endblock extra_js %}

你显然不需要看 base.html。

如果有人能帮我解开这个谜,那将大有帮助,因为我在这方面遇到了很多问题并且已经被困了好几天了。

非常感谢。

【问题讨论】:

    标签: python django file-upload


    【解决方案1】:

    我认为你应该在视图中使用“get_or_create”。

    希望对您有所帮助:get_or_create throws Integrity Error

    【讨论】:

    • 但是我永远不会得到文件,我正在上传一个全新的文件,如果它与另一个已经上传的文件相同,它将更改文件名。我已经尝试了一些文件,但总是会出现该错误。如果我删除数据库,我可以上传一个文件,然后错误返回。这个错误是什么意思?
    • 我仔细看了,你是对的,你可以像视图一样实例化。关于完整性错误,我认为应该是“OneToOneField”客户端关系。看看是否有人澄清得更好,很抱歉我无法提供更多帮助。
    • 感谢您的尝试,我似乎无法弄清楚出了什么问题,但是将 dropzonejs 添加到混合中会变得更糟,所以现在我正在努力解决这个问题。
    猜你喜欢
    • 2013-03-27
    • 2011-09-21
    • 2011-07-31
    • 2011-03-18
    • 2013-05-08
    • 2011-06-27
    • 2016-03-11
    • 2017-01-18
    • 2023-03-24
    相关资源
    最近更新 更多