Django:使用相同的视图在两个单独的页面上处理相同的表单
Django: Use same view to process same form on two separate pages
我可能想得太多了,也可能没有。我有一个注册表格,我想在索引页上使用它并作为一个独立的表格。出于某种原因,独立表单工作得很好,但索引页上的表单在提交时给我一个 403 错误。稍后我将使用 jQuery,但我需要在没有 JavaScript.
的情况下也能正常工作
呈现类似于 Facebook 主页的注册表单
# views.py snippet
class IndexPageTemplateView(TemplateView): # index page(http://localhost)
template_name = 'fld/index.html'
def get(self, request, *args, **kwargs):
# prevent logged in users from accessing welcome page
if self.request.user.is_authenticated():
return HttpResponse(reverse("member_homepage", args=some_args))
else:
return render_to_response(self.template_name)
# Account view
class AccountCreateView(CreateView): # standalone(http://localhost/signup)
model = Account
form_class = CreateAccountForm
template_name = 'fld2/account_form'
success_url = 'thanks'
def get(self, request, *args, **kwargs):
# prevent logged in users from seeing this form
if self.request.user.is_authenticated():
# get the username of logged in user
...
# redirect to homepage
return HttpResponseRedirect(reverse('some_args', args=(args,)))
else:
# display form to non members
return render(request, self.template_name, {'form': self.get_form_class()})
def form_valid(self, form):
clean = form.cleaned_data
form.instance = form.save()
if form.instance:
try:
# send email
except Account.DoesNotExist:
...
return super(AccountCreateView, self).form_valid(form)
我实际上是在使用具有不同操作属性的完全相同的形式。我试过交换属性值、使用相同的属性值和不使用属性值。我似乎根本无法从索引页面访问我的视图,即使我在其中进行硬编码时也会收到 403 错误。基本上,访问者应该能够在主页(如 Facebook)或注册页面(如 Twitter)上注册。我在想我可能必须使用信号来完成这项工作。
<!--index.html snippet-->
<form action="{% url "create_account" %}" method="post">{% csrf_token %}
<input name="username" type="text" required>
<input name="password" type="password" required>
<input name="email" type="email" required>
<input name="signup1" type="submit" value="Create account">
</form>
<!--account_form.html-->
<form action="." method="post">{% csrf_token %}
<input name="username" type="text" required>
<input name="password" type="password" required>
<input name="email" type="email" required>
<input name="signup2" value="Create account" type="submit">
</form>
主要urls.py片段
url(
regex=r'^$',
view=WelcomePageTemplateView.as_view(),
name='index'
),
url(
regex=r'^signup$',
view=include('account.urls'),
# name='signup'
),
url(
regex=r'^(?P<slug>[\w]+)/settings/?',
view=include('account.urls'),
)
帐号urls.py
url(
regex=r'^$',
view=AccountCreateView.as_view(),
name="create_account"
),
{% csrf_token %}
标签需要访问模板中的请求对象。您在 AccountCreateView
中使用了 render
,默认情况下包含请求,但在您的 IndexPageTemplateView
中,您使用了 render_to_response
,但不包含。
修复索引视图的最简单方法是使用 render
而不是 render_to_response
。
def get(self, request, *args, **kwargs):
# prevent logged in users from accessing welcome page
if self.request.user.is_authenticated():
return HttpResponse(reverse("member_homepage", args=some_args))
else:
return render(request, self.template_name)
当您覆盖基于 class 的视图时,覆盖 get
和 post
通常不是一个好主意,因为您最终会重复(或破坏)功能。在您的情况下,最好调用 super()
而不是将您自己的代码写入 return 响应。
def get(self, request, *args, **kwargs):
# prevent logged in users from accessing welcome page
if self.request.user.is_authenticated():
return HttpResponse(reverse("member_homepage", args=some_args))
else:
return super(IndexPageTemplateView, self).get(request, *args, **kwargs)
我可能想得太多了,也可能没有。我有一个注册表格,我想在索引页上使用它并作为一个独立的表格。出于某种原因,独立表单工作得很好,但索引页上的表单在提交时给我一个 403 错误。稍后我将使用 jQuery,但我需要在没有 JavaScript.
的情况下也能正常工作呈现类似于 Facebook 主页的注册表单
# views.py snippet
class IndexPageTemplateView(TemplateView): # index page(http://localhost)
template_name = 'fld/index.html'
def get(self, request, *args, **kwargs):
# prevent logged in users from accessing welcome page
if self.request.user.is_authenticated():
return HttpResponse(reverse("member_homepage", args=some_args))
else:
return render_to_response(self.template_name)
# Account view
class AccountCreateView(CreateView): # standalone(http://localhost/signup)
model = Account
form_class = CreateAccountForm
template_name = 'fld2/account_form'
success_url = 'thanks'
def get(self, request, *args, **kwargs):
# prevent logged in users from seeing this form
if self.request.user.is_authenticated():
# get the username of logged in user
...
# redirect to homepage
return HttpResponseRedirect(reverse('some_args', args=(args,)))
else:
# display form to non members
return render(request, self.template_name, {'form': self.get_form_class()})
def form_valid(self, form):
clean = form.cleaned_data
form.instance = form.save()
if form.instance:
try:
# send email
except Account.DoesNotExist:
...
return super(AccountCreateView, self).form_valid(form)
我实际上是在使用具有不同操作属性的完全相同的形式。我试过交换属性值、使用相同的属性值和不使用属性值。我似乎根本无法从索引页面访问我的视图,即使我在其中进行硬编码时也会收到 403 错误。基本上,访问者应该能够在主页(如 Facebook)或注册页面(如 Twitter)上注册。我在想我可能必须使用信号来完成这项工作。
<!--index.html snippet-->
<form action="{% url "create_account" %}" method="post">{% csrf_token %}
<input name="username" type="text" required>
<input name="password" type="password" required>
<input name="email" type="email" required>
<input name="signup1" type="submit" value="Create account">
</form>
<!--account_form.html-->
<form action="." method="post">{% csrf_token %}
<input name="username" type="text" required>
<input name="password" type="password" required>
<input name="email" type="email" required>
<input name="signup2" value="Create account" type="submit">
</form>
主要urls.py片段
url(
regex=r'^$',
view=WelcomePageTemplateView.as_view(),
name='index'
),
url(
regex=r'^signup$',
view=include('account.urls'),
# name='signup'
),
url(
regex=r'^(?P<slug>[\w]+)/settings/?',
view=include('account.urls'),
)
帐号urls.py
url(
regex=r'^$',
view=AccountCreateView.as_view(),
name="create_account"
),
{% csrf_token %}
标签需要访问模板中的请求对象。您在 AccountCreateView
中使用了 render
,默认情况下包含请求,但在您的 IndexPageTemplateView
中,您使用了 render_to_response
,但不包含。
修复索引视图的最简单方法是使用 render
而不是 render_to_response
。
def get(self, request, *args, **kwargs):
# prevent logged in users from accessing welcome page
if self.request.user.is_authenticated():
return HttpResponse(reverse("member_homepage", args=some_args))
else:
return render(request, self.template_name)
当您覆盖基于 class 的视图时,覆盖 get
和 post
通常不是一个好主意,因为您最终会重复(或破坏)功能。在您的情况下,最好调用 super()
而不是将您自己的代码写入 return 响应。
def get(self, request, *args, **kwargs):
# prevent logged in users from accessing welcome page
if self.request.user.is_authenticated():
return HttpResponse(reverse("member_homepage", args=some_args))
else:
return super(IndexPageTemplateView, self).get(request, *args, **kwargs)