在过去的两天内,我一直在努力解决这个问题,并且可以寻求帮助。我的Django 1.6应用程序的主页将包括两种形式,一种用户可以用来登录该站点,另一种用户可以用来注册(创建登录名):
# templates/home/home_page.html
{% csrf_token %}
{{ sign_in_form.as_p }}
{% if next %}
{% else %}
{% endif %}
Sign up
{% csrf_token %}
{{ sign_up_form.as_p}}
如果用户提交sign_in表单,则会将他们带到可以查看其他网站成员的页面。如果他们提交sign_up表单,他们将被带到第二个注册页面,在那里他们将创建用户个人资料,等等。
最初,我将使用此问题中显示的技术并使用一个视图来处理主页。但是,我决定尝试使用两个视图,因为我使用的是Django的实际登录视图(django.contrib.auth.views.login),以便可以向其中添加代码以检测用户的设备(电话,平板电脑或计算机),然后将该视图与我的sign_up视图合并将创建一个非常长且复杂的视图来进行维护。我希望将两种形式的视图分开。
这是主页和sign_in视图:
# apps/home/views:
def home_page(request, template):
sign_in_form = SignInAuthenticationForm()
sign_up_form = CreateAccountForm()
return render(request, template, {"sign_in_form": sign_in_form,
"sign_up_form": sign_up_form})
@sensitive_post_parameters()
@csrf_protect
@never_cache
def sign_in(request,
template='home_page.html',
redirect_field_name=REDIRECT_FIELD_NAME,
# authentication_form=AuthenticationForm,
authentication_form=SignInAuthenticationForm,
current_app=None, extra_context=None):
# Do device detection here...
# django.contrib.auth.views code goes here...
return response
注册视图将只是您典型的基于函数的视图,用于处理Django文档中所述的表单。
我正在努力的是我的URLconf文件。这是我的主URLconf文件和" home" 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 / urls.py文件中找到正确的URL模式,因为表单中的URL签名不正确。也许我需要这样做以匹配sign_in视图中的参数:
但是我已经在家庭URLconf中显示了模板名称。而且我认为我不需要在表单操作中传递其他视图参数(例如redirect_field_name),因为它们是可选的。无论如何,将此参数添加到表单操作并不能解决问题。
让我感到困惑的一件事是如何设置第一个url参数。我将它们分别设置为r'^ sign_in / $'和r'^ sign_up / $',因为如果将它们都设置为r'^ $',页面将正确显示,但是当我提交任何一种表单时,它只会回发到主页。您可以通过在页面上执行"查看源代码"来看到这种情况。它显示每个表单的动作将为" /"。另一方面,我现在拥有的方式似乎对我来说是不正确的,因为该站点实际上没有主页URL,因此实际上将没有" / sign_in /"和" / sign_up /" URL。另外,是否存在一个问题,如果用户不正确地提交了一个表单,则这两个表单的错误都将在页面上呈现出来?
就我所知,Django文档并未真正描述执行我要尝试做的事情的标准方法。它描述了如何呈现同一表单的多个版本。谁能告诉我我在做什么错?
谢谢。
为什么您不尝试使用表单集来收集2个表单并在视图中测试form1是否有效做某事(签名)或form2有效是否做其他事docs.djangoproject.com/en/1.6/topics/forms/formsets
因为据我所知,FormSets适合遍历同一表单的多个副本。 在我的情况下,我有两种不同的形式。 但是也许我不了解他们。 他们似乎仍然不是正确的解决方案。
是的,那是正确的,但是在您的案例中,您也可以在同一视图中使用多个表单集2个表单集每个表单集都有一个表单
您的表单名称是'sign_in_form'和'sign_up_form',但是在html中您将它们写为'form.as_p'而不是'sign_in_form.as_p'和'sign_up_form.as_p',这是您的代码中第一次看到的错误。
真正的问题出在您的url配置中。 在您的主要urls.py中
url(r'^$', include('apps.home.urls')),
Other ...
尽管您将无法进入localhost:8000 / sign_in /,因为最初它并不满足^ $。
尝试通过更改它
url(r'', include('apps.home.urls')),
并将其放在urls.py的末尾。
虽然我还没有完全测试过,但这似乎可以解决问题。 您能解释一下为什么可行吗? 我没有在Django文档的任何地方看到" url(r,...)"语法。 谢谢。
请注意include(apps.home.urls)仅适用于/不适用于sign_in或sign_out。 url(r,...)基本上表示每种模式,但是我认为这不是编写url的好方法。 仅在开发期间可接受。
user2309693,非常感谢您对这个问题的帮助。 我已经完成了所有的测试,而且看起来还可以。 您在最近的评论中说过,这种处理url的方式仅在开发期间适用。 在生产环境中我该怎么办? 您的修复程序确实可以使事情起作用,因此我不愿意对其进行更改。 再次感谢!!
我测试一下,看看这是你想要的:
view.py
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})
page.html:
{% csrf_token %}
{{ login_formset.management_form }}
{% for form in login_formset %}
{{ form }}
{% endfor %}
{{ sign_formset.management_form }}
{% for form in sign_formset %}
{{ form }}
{% endfor %}
谢谢slim_ch,但我认为我将采用其他解决方案。
1457

被折叠的 条评论
为什么被折叠?



