django一个html先后两个form,在一个带有两个视图的页面中处理多个Django表单的正确方法?...

在过去的两天内,我一直在努力解决这个问题,并且可以寻求帮助。我的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,但我认为我将采用其他解决方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值