Django表单和图像上传在同一页面上

时间:2011-05-13 20:36:31

标签: django django-forms django-models

我正在尝试弄清楚如何上传图片并在单个表单上获取用户输入。 我的模特:

class Image(models.Model):
    artist = models.ForeignKey('Artist')
    image = models.ImageField(upload_to="assets/images")

class Album(models.Model):
    artist = models.ForeignKey(Artist,null=True)
    notes = models.CharField(max_length = 50)
    display = models.BooleanField()
    date_created = models.DateTimeField(auto_now_add=True)

我的表格

class AlbumForm(forms.ModelForm):
    class Meta:
        model = Album
        fields = ('notes',)

class ImageForm(forms.ModelForm):
    class Meta:
        model = Image
    exclude = ('artist')`

我认为我的观点是错误的,我如何将这两个表单传递给模板?模板呈现两种形式的样子是什么样的?我想使用一个提交按钮。

def create(request):
    form1 = ImageForm(request.POST, request.FILES or None)
    form2= AlbumForm(request.POST or None)
    if form2.is_valid() and form1.is_valid():
        image = form1.save(commit=False)
        image.artist = Artist.objects.get(pk=3)
        image.save()
        album = form2.save(commit=False)

        album.save()
        if 'next' in request.POST:
            next = request.POST['next']
        else:
            next = reverse('art_show')
        return HttpResponseRedirect(next)
    return render_to_response(
        'art/create.html',
        {'ImageForm':form1},
        { 'AlbumForm': form2},
        context_instance = RequestContext(request)
)

1 个答案:

答案 0 :(得分:3)

你可能会这样做:

<form action="." method="post" enctype="multipart/form-data">
    {{ImageForm.image}} <br />
    {{AlbumForm.notes}} <br />
    {{AlbumForm.display}} <br />
    ...
    <input type="submit" value="Save" />
</form>

这将返回request.POST对象中的form1和form2对象。

views.py:

...
return render_to_response('art/create.html', 
    {'ImageForm': form1, 'AlbumForm': form2}, 
    context_instance = RequestContext(request)
)

或者你可以这样做:

...
return render_to_response('art/create.html',
    locals(), 
    context_instance = RequestContext(request)
)

虽然,第二个将添加您的函数使用的所有变量,因此您应该确保如果您使用它,您的函数将不使用任何内置名称。通常不常见,但你应该确定。

编辑:添加了一个提交按钮,以明确您只需要一个。还添加了视图的响应。