用两个视图在一个页面中处理多个Django表单的正确方法?
过去两天我一直在努力解决这个问题,需要一些帮助。my Django 1.6应用程序的主页将包括两个表单,一个是用户可以用来登录站点的表单,另一个是用户可以用来注册(创建登录)站点的表单:用两个视图在一个页面中处理多个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
# 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 %}