我是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>
感谢任何帮助。
答案 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()
时,上下文中填充了album
和form
,而不是form2
,因为在这种情况下,它未在本地范围内初始化。您需要在上面的部分添加form2
初始化,例如:
if request.method == 'GET':
form2 = AlbumForm()
form = dropDownForm(request.user)
...
return render(request, "base.html", locals())
P.S。使用locals()
来填充上下文是明智的,但是不好的想法 - 它是不安全的,它将本地范围中定义的所有变量添加到模板中可用的上下文中。