Textarea没有以Django形式显示

时间:2016-04-22 09:13:18

标签: python html django django-forms

我是Django的新手

在我的主页上,我想为用户提供两种选择:将照片上传到新相册或现有相册。

问题是其中一种形式最初没有在HTML中显示,我只能看到它的提交按钮。但是,当我点击提交按钮时,会出现该表单,以及“此字段是必需的”'警告。

为此,我在 forms.py

中创建了2个表单
class AlbumForm(ModelForm):
    class Meta:
        model = Album
        fields = ('title', 'description',)


class dropDownForm(forms.Form):
    Albums = forms.ModelChoiceField(queryset=Album.objects.filter(user__id=1))

    def __init__(self, user, *args, **kwargs):
        super(dropDownForm, self).__init__(*args, **kwargs)
        self.fields['Albums'].queryset = Album.objects.filter(user__id=user.id)

AlbumForm用于创建新专辑,dropDownForm用于从现有专辑中进行选择。

在views.py中我有:

def upload_album(request):
        if request.user.is_authenticated():
            if request.user.albums.all() is not None:
                albums = request.user.albums.all()
        dropdownAlbum = request.POST.get('Albums')

        if request.method == 'GET':
            album = AlbumForm()
            form = dropDownForm(request.user)
        if ((request.method == 'POST') and ('ExistingAlbum' in request.POST)):
            form = dropDownForm(request.user)
            userID = request.user.id
            curr = UserProfile.objects.filter(id=userID).first()
            curr.currentAlbum = int(dropdownAlbum)
            intAlbum = int(dropdownAlbum)
            curr.save()
            return HttpResponseRedirect('/upload-media')

        if ((request.method == 'POST') and ('CreateNewAlbum' in request.POST)):
            form2 = AlbumForm(request.POST)
            if form2.is_valid():
                album = form2.save(commit=False)
                album.user = request.user
                album = form2.save()
                created_album_id = Album.objects.filter(title=album).first().id
                userID = request.user.id
                curr = UserProfile.objects.filter(id=userID).first()
                curr.currentAlbum = created_album_id
                curr.save()
                request.user.albums.add(album)
                return HttpResponseRedirect('/upload-media/')

        return render(request, "base.html", locals())

并在HTML中:

<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" name="ExistingAlbum" value="Continue" href="/upload-media/">
</form>

</div>
<div>
<form method="POST">
    {% csrf_token %}
    {{ form2.as_p }}
    <button type="submit" name="CreateNewAlbum" value="Create New Album">Create</button>
</form>
</div>

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

我刚刚查看了locals实际上是什么,这是构建你的上下文数据的一种可怕的方式(这就是为什么我没有听到过我也没有听到过它)。

您的上下文数据应该是由需要的值组成的字典,以便您的模板正确呈现。因此,您应该构建一个包含需要的元素的字典。

作为起点。

mpirun -np 8 -wdir ./S1 $WDIR/S1/$EXE :\
    -np 8 -wdir ./S2 $WDIR/S2/$EXE :\
    -np 8 -wdir ./S3 $WDIR/S3/$EXE :\
    -np 8 -wdir ./S4 $WDIR/S4/$EXE

答案 1 :(得分:1)

我的猜测是form2没有出现。

问题是:当您最初请求页面时,它是GET请求,因此只执行以下部分:

if request.method == 'GET':
    album = AlbumForm()
    form = dropDownForm(request.user)
return render(request, "base.html", locals())

因为其他if分支需要POST,这是在提交数据时使用的请求谓词,当您按下Submit按钮时会发生这种情况。

当您致电locals()时,上下文中填充了albumform,而不是form2,因为在这种情况下,它未在本地范围内初始化。您需要在上面的部分添加form2初始化,例如:

if request.method == 'GET':
    form2 = AlbumForm()
    form = dropDownForm(request.user)

...

return render(request, "base.html", locals())

P.S。使用locals()来填充上下文是明智的,但是不好的想法 - 它是不安全的,它将本地范围中定义的所有变量添加到模板中可用的上下文中。