【问题标题】:Textarea not shown in Django formTextarea 未以 Django 形式显示
【发布时间】:2016-08-15 20:09:21
【问题描述】:

我是 Django 新手

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

问题是其中一个表单最初没有显示在 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>

感谢任何帮助。

【问题讨论】:

    标签: python html django django-forms


    【解决方案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())
    

    附:使用locals() 填充上下文很聪明,但不是一个好主意——它不安全,它会将本地范围内定义的所有变量添加到模板中可用的上下文中。

    【讨论】:

      【解决方案2】:

      我刚刚查看了 locals 实际上是什么,这是一种构建上下文数据的可怕方式(这就是为什么我从未听说过它并不感到惊讶的原因)。

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

      作为一个起点。

      {
          'form': AlbumForm(),
          'form2': dropDownForm(request.user)
      }
      

      【讨论】:

        猜你喜欢
        • 2021-12-07
        • 2019-06-05
        • 2011-08-06
        • 2018-03-20
        • 2018-05-19
        • 2018-10-19
        • 1970-01-01
        • 1970-01-01
        • 2014-11-11
        相关资源
        最近更新 更多