Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用两个视图在一个页面中处理多个Django表单的正确方法?_Django_Django Forms_Django Templates_Django Views - Fatal编程技术网

用两个视图在一个页面中处理多个Django表单的正确方法?

用两个视图在一个页面中处理多个Django表单的正确方法?,django,django-forms,django-templates,django-views,Django,Django Forms,Django Templates,Django Views,过去两天我一直在努力解决这个问题,需要一些帮助。my Django 1.6应用程序的主页将包括两个表单,一个是用户可以用来登录站点的表单,另一个是用户可以用来注册(创建登录)站点的表单: # templates/home/home_page.html <div class="sign-in-form"> <form action="{% url 'apps.home.views.sign_in' %}" method="post"> {% csrf

过去两天我一直在努力解决这个问题,需要一些帮助。my Django 1.6应用程序的主页将包括两个表单,一个是用户可以用来登录站点的表单,另一个是用户可以用来注册(创建登录)站点的表单:

# templates/home/home_page.html
<div class="sign-in-form">
    <form action="{% url 'apps.home.views.sign_in' %}" method="post">
        {% csrf_token %}

        {{ sign_in_form.as_p }}

        {% if next %}
            <input type="hidden" name="next" value="{{ next }}">
        {% else %}
            <input type="hidden" name="next" value="{% url 'view-members' %}">
        {% endif %}
        <input type="submit" value="Sign in">
    </form>
</div>

<div class="sign-up-form">
<fieldset>
    <legend>Sign up</legend>
    <form action="{% url 'apps.home.views.sign_up' %}" method="post">
        {% csrf_token %}

        {{ sign_up_form.as_p}}

        <p><input type="submit" value="Sign up" /></p>
    </form>
</fieldset>
</div>
注册视图将只是处理Django中描述的表单的典型、基于函数的视图

我正在努力解决的是我的URLconf文件。以下是我的主文件和“主”URLconf文件:

# conf/urls.py
urlpatterns = patterns('',
    url(r'^$',         include('apps.home.urls')),
    # Other url patterns...
)

# apps/home/urls.py
urlpatterns = patterns('apps.home.views',
    url(r'^$',
        'home_page',
        {'template': 'home/home_page.html'},
        name='home-page'),
    url(r'^sign_in/$',
        'sign_in',
        {'template': 'home/home_page.html'},
        name='sign-in'),
    url(r'^sign_up/$',
        'sign_up',
        {'template': 'home/home_page.html'},
        name='sign-up'),
)
问题是,我在模板渲染过程中遇到以下错误:

NoReverseMatch at /

Reverse for 'apps.home.views.sign_in' with arguments '()' and keyword arguments '{}' not found. 1 pattern(s) tried: ['$sign_in/$']

Request Method: GET
Request URL:    http://localhost:8000/
Django Version: 1.6.2
Exception Type: NoReverseMatch
Exception Value:    
Reverse for 'apps.home.views.sign_in' with arguments '()' and keyword arguments '{}' not found. 1 pattern(s) tried: ['$sign_in/$']
Exception Location: /Users/smith/venv/swing/lib/python2.7/site-packages/django/core/urlresolvers.py in _reverse_with_prefix, line 429
Python Executable:  /Users/smith/venv/swing/bin/python
Python Version: 2.7.5
Python Path:    
['/Users/smith/Dropbox/www/swing',
 '/Users/smith/venv/swing/lib/python2.7/site-packages/wurfl_cloud-1.0.1-py2.7.egg',
 '/Users/smith/venv/swing/lib/python27.zip',
 '/Users/smith/venv/swing/lib/python2.7',
 '/Users/smith/venv/swing/lib/python2.7/plat-darwin',
 '/Users/smith/venv/swing/lib/python2.7/plat-mac',
 '/Users/smith/venv/swing/lib/python2.7/plat-mac/lib-scriptpackages',
 '/Users/smith/venv/swing/Extras/lib/python',
 '/Users/smith/venv/swing/lib/python2.7/lib-tk',
 '/Users/smith/venv/swing/lib/python2.7/lib-old',
 '/Users/smith/venv/swing/lib/python2.7/lib-dynload',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/Users/smith/venv/swing/lib/python2.7/site-packages']
起初,我开始想,也许它告诉我,它无法在我的home/URL.py文件中找到正确的URL模式,因为我表单中的URL签名不正确。也许我需要这样做来匹配视图中符号_中的参数:

<form action="{% url 'apps.home.views.sign_in' 'home/home_page.html' %}" method="post">

但是我已经在主URLconf中显示了模板名称。我认为我不需要在表单action中传递其他视图参数(例如redirect_field_name),因为它们是可选的。在任何情况下,将此参数添加到表单操作都无法修复它

让我困惑的事情之一是如何设置第一个url参数。我已将它们设置为r“^sign\u in/$”和r“^sign\u up/$”,因为如果我将它们都设置为r“^U$”,页面将正确呈现,但当我提交任何一个表单时,它只会将帖子返回主页。您可以通过在页面上执行“查看源代码”来看到这一点。它显示每个窗体的操作将为“/”。另一方面,我现在使用的方式对我来说似乎不正确,因为该站点实际上没有“/sign\u/”和“/sign\u/”URL,因为这两个表单都在主页上。此外,是否会出现这样一个问题:如果用户不正确地提交了一个表单或另一个表单,两个表单的错误都会在页面上呈现

据我所知,Django文档并没有真正描述一种标准的方法来完成我试图做的事情。它描述了如何呈现同一表单的多个版本。谁能告诉我我做错了什么


谢谢。

您的表单名称是“登录表单”和“登录表单”,但在html中,您编写了“form.as\p”而不是“登录表单.as\p”和“登录表单.as\p”。这是您代码中看到的第一个错误

真正的问题在于URL配置。在主URL.py中,您有

 url(r'^$', include('apps.home.urls')),
 Other ...
虽然您将无法访问localhost:8000/登录/因为最初它不满足^$

试着改变它

url(r'', include('apps.home.urls')),

然后把它放在url.py的末尾。

我测试一下,看看这是否是您想要的: view.py

page.html:

            <form action="{% url 'loginUser'  %}" method="post">
                    {% csrf_token %}
{{ login_formset.management_form }}
{% for form in login_formset %}
    {{ form }}
{% endfor %}

{{ sign_formset.management_form }}
{% for form in sign_formset %}


 {{ form }}


 {% endfor %}

{%csrf_令牌%}
{{login_formset.management_form}
{login_formset%}中表单的%
{{form}}
{%endfor%}
{{sign_formset.management_form}
{sign_formset%}中表单的%
{{form}}
{%endfor%}

为什么不尝试使用Formset收集这两个表单,并在视图中测试form1是否有效执行某些操作(签名)或form2是否有效执行其他操作,因为据我所知,Formset旨在迭代同一表单的多个副本。在我的情况下,我有两种不同的形式。但也许我不理解他们。它们似乎仍然不是正确的解决方案。是的,这是正确的,但是您也可以在同一视图中使用多个表单集。在您的案例中,2个表单集evry formset有一个表单,而我还没有完全测试它,这看起来可能会解决问题。你能解释一下为什么会这样吗?我没有看到Django文档中描述的“url(r“”,…),”语法。谢谢。请注意,include('apps.home.url')仅用于“/”而不是“登录”或“注销”。url(r“”,…)基本上意味着每种模式,但我认为这不是编写url的好方法。只有在开发过程中才可以接受。user2309693,非常感谢您对这个问题的帮助。我已经做了所有的测试,它看起来很有效。您在最近的评论中说,这种处理URL的方法只适用于开发过程。在生产环境中我应该做什么?你的修正确实让事情顺利,所以我不愿意改变它。再次感谢!!谢谢slim_ch,但我想我会选择另一种解决方案。
def loginUser(request,**Kargs):
LoginFormSet = formset_factory(LoginForm)
SignFormSet = formset_factory(SignForm)
if request.method == 'POST':
    login_formset = LoginFormSet(request.POST, prefix='login')
    sign_formset = SignFormSet(request.POST ,prefix='sign')
    if login_formset.is_valid():
        #do somthing

    elif sign_formset.is_valid():
        #do somthing

    return render(request, 'reservetion/login.html',{'login_formset': login_formset,'sign_formset':sign_formset})

else:
    login_formset = LoginFormSet(prefix='login')
    sign_formset = SignFormSet(prefix='sign')
    return render(request, 'reservetion/login.html',{'login_formset': login_formset,'sign_formset':sign_formset})
            <form action="{% url 'loginUser'  %}" method="post">
                    {% csrf_token %}
{{ login_formset.management_form }}
{% for form in login_formset %}
    {{ form }}
{% endfor %}

{{ sign_formset.management_form }}
{% for form in sign_formset %}


 {{ form }}


 {% endfor %}