django使用多文件上传创建表单

时间:2015-11-26 20:12:38

标签: python django django-models django-forms multiple-file-upload

我是django的新手,我正在尝试创建博客。我已经有用户使用外键的帖子模型。用户可以创建简单的消息帖,但我想进一步。我希望能够为每个帖子添加许多文件。我认为我应该创建一个名为Files with file area的模型。但我真的不知道如何制作一个带有帖子和输入的表格,以便在帖子表格下添加文件。我听说我需要使用formset,但是我找不到做这样的事情的好例子。总而言之,如果你能给我发一些教程(例子)或给出一些如何启动它的建议,我将不胜感激。

编辑:

我做了所有的事情,就像在示例中一样,现在我的表格有文件输入,但这不是实际上传的任何地方。当我运行shell时,我没有任何附件对象。继承我的代码。

型号:

 from django.db import models
from django.contrib.auth.models import User
from multiupload.fields import MultiFileField
import datetime
class PostManager(models.Manager):
    def published(self, ):
        return self.get_queryset().filter(active=True, pub_date__lt=datetime.datetime.now())

class Post(models.Model):
    author=models.ForeignKey(User, verbose_name=u"Autor postu", blank=True, null=True)
    active=models.BooleanField(verbose_name=u"Aktywnosc postu", default="False")
    title=models.CharField(max_length=40, verbose_name=u"tytul")
    lead=models.TextField(verbose_name=u"wprowadzenie")
    body=models.TextField(verbose_name=u"Zawartosc postu")
    pub_date=models.DateTimeField(verbose_name=u"Data publikacji", blank="True", null="True")

    objects= PostManager()

    class Meta:
        verbose_name=u"post"
        verbose_name_plural=u"posty"

class Attachment(models.Model):
    post = models.ForeignKey(Post, verbose_name=u"post")
    file = models.FileField(upload_to='attachments', verbose_name=u"Plik")
    file_name=models.TextField(verbose_name=u"Nazwa pliku")

的观点:

from django.shortcuts import render, redirect, get_object_or_404
from django.http import HttpResponse, HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.contrib.auth import logout, login, authenticate
from django.views.generic import ListView, DetailView
from .models import Post
import datetime
from .forms import PostForm, CreationForm
from django.views.generic.edit import FormView, CreateView

class PostListView(ListView):
    model= Post

    def get_queryset(self, ):
        return Post.objects.published()

class PostDetailView(DetailView):
    model= Post


def Edit(request, pk):
    post= get_object_or_404(Post, pk=pk)
    form= PostForm(instance=post)
    context={
        'post': post,
        'form': form,
    }
    return render(request,'posts/edit_post.html', context)

def LogMeOut(request):
    logout(request)
    return HttpResponseRedirect('/posts')

def log_form(request):
    return render(request, 'posts/log_me_in.html', {})

def logged(request):
    if request.method == 'POST':        
        user_name=request.POST.get('usr', '')
        user_password=request.POST.get('pwd','')
        user = authenticate(username=user_name, password=user_password)
        if user is not None:
            login(request,user)
            return HttpResponseRedirect(reverse('post_list'))
        else:
            return HttpResponse('bieda')


def apply_edit(request, post_id):
    form=PostForm(request.POST)
    if form.is_valid():
        instance=form.save(commit= False)
        instance.author=request.user
        instance.id=post_id
        instance.pub_date=datetime.datetime.now()
        instance.save();
        return HttpResponseRedirect(reverse('post_list'))

def post_creation(request):
    form=PostForm()
    context= {
        'form': form
    }
    return render(request, 'posts/post_creation.html', context)

def my_posts(request):
    user=request.user
    object_list=user.post_set.all()
    context={
        'object_list': object_list,
    }
    return render(request, 'posts/post_list.html', context)




def create_post(request):
    form=PostForm()
    if request.method=='POST':
        form=PostForm(request.POST)
        if form.is_valid():
            instance=form.save()
            instance.active=True;
            instance.author=request.user
            instance.pub_date=datetime.datetime.now()
            instance.save();
    return HttpResponseRedirect(reverse('post_list'))


class ContactView(CreateView):
    model = Post
    form_class = CreationForm
    template_name = 'posts/post_creation.html'
    success_url = 'posts/post_list.html'

forms.py:

from django import forms
from django.contrib.auth.models import User
from .models import Post, Attachment
import datetime
from multiupload.fields import MultiFileField

class PostForm(forms.ModelForm):
    class Meta:
        model= Post
        exclude=['author', 'pub_date']

class CreationForm(forms.ModelForm):
    class Meta:
        model=Post
        fields=['active', 'title', 'lead', 'body']



    files = MultiFileField(min_num=1, max_num=3, max_file_size=1024*1024*5)


    def save(self, commit=True):
        instance = super(ContactForm, self).save(commit=False)
        instance.author=User
        instance.pub_date=datetime.datetime.now()
        instance.save()
        for each in self.cleaned_data['files']:
            Attachment.objects.create(file=each, post=instance, file_name=file.name)

        return instance

我认为网址很好,所以我不发布。有人可以检查一下是否正确。如果没有那么错。

1 个答案:

答案 0 :(得分:1)

我使用django-multiupload,这是一个可以集成的可重用的Django应用程序。

查看此链接http://chive.ch/django-multiupload/