Django上传文件

时间:2015-08-01 22:58:50

标签: python django file-upload

我有一个仪表板,您可以在其中上传文件,并可以查看您上传的文件。奇怪的是,当你上传第二个文件时,它会上传但却会出错: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。

如果有人可以帮助我解决这个谜团,那将会有所帮助,因为我遇到了很多问题并且已经被困住了好几天。

非常感谢。

1 个答案:

答案 0 :(得分:1)

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

我希望这可以提供帮助:get_or_create throws Integrity Error