django - 将初始值从先前的详细视图传递到表单字段
问题描述
我有点困惑如何做到这一点,我在用户详细信息页面上有一个“联系用户”按钮。我正在尝试将电子邮件字段的初始表单值设置为用户从上一个详细信息页面视图发送的电子邮件,以便预先填充。
我会将 user.email 作为 kwarg 传递到按钮 url 中吗?
视图.py
def Contact(request):
form_class = ContactForm
# new logic!
if request.method == 'POST':
form = form_class(data=request.POST)
if form.is_valid():
contact_name = request.POST.get(
'contact_name'
, '')
contact_email = request.POST.get(
'contact_email'
, '')
form_content = request.POST.get('content', '')
# Email the profile with the
# contact information
template = get_template('contact_template.txt')
context = {
'contact_name': contact_name,
'contact_email': contact_email,
'form_content': form_content,
}
content = template.render(context)
email = EmailMessage(
"New contact form submission",
content,
"Your website" +'',
['youremail@gmail.com'],
headers = {'Reply-To': contact_email }
)
email.send()
return redirect('contact_form')
return render(request, 'portal/contact_form.html', {
'form': form_class,
})
表格.py
from django import forms
class ContactForm(forms.Form):
contact_name = forms.CharField(required=True)
contact_email = forms.EmailField(required=True, initial='{ kwarg }')
content = forms.CharField(
required=True,
widget=forms.Textarea
)
user_detail.html
<div class="col-lg-4 text-center p-5" style="padding-right:20px; border-right: 1px solid #e5e5e5;">
<a href="{% url 'portal:contact_form' kwarg.user.email %}">
<h1><i class="fa fa-2x fa-envelope-o text-success" aria-hidden="true"></i></h1>
<p class="text-muted mt-3 ">Contact Customer</p>
</a>
</div>
解决方案
有多种方法可以做到这一点。例如:
方法一:在 URL Querystring 中发送
从您以前的详细信息视图中,以 url 查询字符串发送电子邮件。例如:
def DetailForm(request, *args, **kwargs):
...
if form.is_valid():
# do some things
user_email = form.cleaned_data.get('user_email') # assuming its the form field you are using for catching user email
redirect_url = "{}?user_email={}".format(self.get_success_url(), user_email)
return HttpResponseRedirect(redirect_url)
并在下一个表单视图中捕获它:
def Contact(request):
form_class = ContactForm(initial={'contact_email': request.GET.get('user_email')})
...
方法2:在会话中存储。
它与最后一种方法几乎相似,但它将数据存储在session中。
def DetailForm(request, *args, **kwargs):
...
if form.is_valid():
# do some things
request.session['user_email'] = form.cleaned_data.get('user_email') # Storing data in session
# every other code
并在下一个表单视图中获取它:
def Contact(request):
form_class = ContactForm(initial={'contact_email': request.session.get('user_email')})
...
更新
如果您来自详细信息页面,则意味着您可以访问该对象。因此,在详细信息页面中,contact
像这样更新按钮:
<a href="{% url 'portal:contact_form' object.email %}">contact</a> // or user.email if you are passing user object as user in context
在联系人视图中:
def Contact(request, email):
if request.method == "GET":
form = ContactForm(initial={'contact_email': email)})
推荐阅读
- html - 设计电商店铺页面和单品页面——正确的做法是什么?
- javascript - mongo 更新脚本:更改嵌入文档中的字段
- symfony - 如何在 Symfony 的 API 平台响应中添加计算属性?
- ssis - SQL Server 链接服务器和 DTSX
- mongodb - 将数据从 Kafka 流式传输到 MongDB 时如何为非 json 格式消息配置接收器连接器
- laravel - Laravel 在日期范围内获取刚刚更新的行 - 在查询中使用 WhereBetween 和 Where
- azure-devops - Azure Devops:将生成排队以在晚上运行
- javascript - reduce 不是 Object.sum 的函数
- android - 无法将 adb Android Studio 连接到 3.4.1
- javascript - 从字符串中删除带有类 notranslate 的 HTML 元素跨度