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

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

请您参考如下方法:

你可能会这样做:

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

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

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


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!