【问题标题】:Django Form and Image Upload on same page同一页面上的 Django 表单和图像上传
【发布时间】:2011-05-13 20:36:30
【问题描述】:

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

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)
)

【问题讨论】:

  • 艺术家的主键是否总是 3?

标签: django django-forms django-models


【解决方案1】:

你可能会这样做:

<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)
)

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

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

【讨论】:

  • 代替使用form1,form2使用ImageForm,AlbumForm
  • 谢谢!如果我在模板中使用 ImageForm,那么视图中的其他任何内容都不需要更改吗?
  • 不,它们是完全分开的。
  • 您需要多部分数据来发送文件字段中的数据,但您的 render_to_response 格式不正确。上下文数据应该是 1 dict({'imageform':form1, 'albumform': form2}),而不是 2。
  • 或者你可以使用方便的 locals() 函数
猜你喜欢
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2019-07-10
  • 1970-01-01
相关资源
最近更新 更多