【问题标题】:Check if a form exists or is rendered in Template. Django检查表单是否存在或在模板中呈现。姜戈
【发布时间】:2018-07-12 14:53:40
【问题描述】:

我有一种情况,有时我会显示一个表单,有时我不显示它。

其实有多个表单使用同一个Submit按钮。

当模板中未显示特定表单时,我该如何处理。

模板代码

{% extends BASE_TEMPLATE %}
{%  load crispy_forms_tags %}
{% block title %}<h2>New Thread</h2>{% endblock %}
{% block content %}
    <div class="col-md-6">
        <form method="post" accept-charset="utf-8">{% csrf_token %}
            {{ threadForm|crispy }}
            {{ postForm|crispy }}
            {% if SHOW_WIKI %}
            {{ wikiFrom|crispy }}
            {% endif %}
            <input type="submit" class="btn btn-primary btn-sm" value="Submit"/>
        </form>
    </div>

{% endblock %}

这是查看代码

@login_required
def createThread(request, topic_title=None):
    if topic_title:
        try:
            if request.method == 'POST':
                topic = Topic.getTopic(topic_title)
                threadForm = ThreadSUForm(request.POST, prefix='thread')
                postForm = PostForm(request.POST, prefix='post')
                show_wiki = getattr(settings, "REFORUMIT_ALLOW_WIKI_FOR_THREADS", False) and topic.is_wiki_allowed
                wikiForm = WikiCreateForm(request.POST, prefix='wiki')

                if threadForm.is_valid() and postForm.is_valid() and wikiForm.is_valid():
                    thread = threadForm.save(commit=False)
                    post = postForm.save(commit=False)
                    wiki = wikiForm.save(commit=False)

                    thread.op = post
                    thread.wiki_revision = None

                    post.setMeta(request)
                    wiki.setMeta(request)


                    if is_authenticated(request):
                        post.created_by = request.user
                        wiki.author = request.user

                    thread.save()
                    wiki.wiki_for = thread
                    wiki.save()
                    post.save()

                    thread.wiki_revision = wiki

                    thread.save()


                    return HttpResponseRedirect(thread.get_absolute_url)
            else:
                topic = Topic.getTopic(topic_title)
                threadForm = ThreadSUForm(prefix='thread', initial={"topic": topic})
                postForm = PostForm(prefix='post')
                wikiForm = WikiCreateForm(prefix='wiki')
                show_wiki = getattr(settings, "REFORUMIT_ALLOW_WIKI_FOR_THREADS", False) and topic.is_wiki_allowed
            context = dict(threadForm=threadForm, postForm=postForm, wikiFrom=wikiForm, SHOW_WIKI=show_wiki)
            return render(request, 'reforumit/create_thread.html', context)
        except Topic.DoesNotExist:
            pass
    return redirect('topics')

【问题讨论】:

  • 似乎线程形式一直存在?
  • @AnupYadav Wiki 表单是唯一的可选表单

标签: django django-forms django-crispy-forms


【解决方案1】:

这不会给出确切的答案,但您可以稍微更改代码。仅提供条件部分。

if threadForm.is_valid() and postForm.is_valid():
    thread = threadForm.save(commit=False)
    post = postForm.save(commit=False)

    thread.wiki_revision = None

    thread.op = post
    post.setMeta(request)

    if is_authenticated(request):
        post.created_by = request.user                  
        post.save()

    thread.save()

    if wikiForm.is_valid():
        print("WikiForm is valid!")
        wiki = wikiForm.save(commit=False)
        print("Wiki has content")
        wiki.setMeta(request)
        if is_authenticated(request):
            wiki.author = request.user
        wiki.wiki_for = thread
        wiki.save()
        thread.wiki_revision = wiki
        thread.save()

    return HttpResponseRedirect(thread.get_absolute_url)

【讨论】:

  • 那么,我可以做if wiki:吗?酷!
  • 工作?如果不是,您可以尝试使用 if wiki: 代替 wikiForm.is_valid() 但条件语句是这里的关键。帖子也一样。
  • 我必须添加thread.wiki_revision = None cos 如果您保存模型而不保存关系将无法正常工作。我有一个循环依赖
  • 另外wikiForm.is_valid()即使不显示也始终有效
  • 已通过将 blank=False 更改为 wikiForm 中的归档来修复
猜你喜欢
  • 1970-01-01
  • 2011-05-13
  • 2011-09-07
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
相关资源
最近更新 更多