Django 德扬戈。如何以两种形式保存数据
我有两种表格:Django 德扬戈。如何以两种形式保存数据,django,Django,我有两种表格: class Form_registration_security (ModelForm): class Meta: model = Security fields = ['fk_id_users_security', 'e_mail', 'password'] widgets = { 'e_mail': forms.TextInput(attrs = {'placeholder': 'Your
class Form_registration_security (ModelForm):
class Meta:
model = Security
fields = ['fk_id_users_security', 'e_mail', 'password']
widgets = {
'e_mail': forms.TextInput(attrs = {'placeholder': 'Your Email'}),
'password': forms.TextInput(attrs = {'placeholder': 'New Password'}),
}
class Form_registration_user (ModelForm):
class Meta:
model = Users
fields = ['id', 'first_name', 'last_name', 'date_birthdaty']
widgets = {
'id': forms.TextInput(attrs = {'placeholder': 'id'}),
'first_name': forms.TextInput(attrs = {'placeholder': 'First Name'}),
'last_name': forms.TextInput(attrs = {'placeholder': 'Last Name'}),
'date_birthdaty': forms.TextInput(attrs = {'placeholder': 'Date'})
}
但数据仅以一种模式保存-(Form_registration_user)
视图中的代码:
def save_registration (request ):
if request.method == 'POST':
form_user = Form_registration_user(request.POST)
form_security = Form_registration_security(request.POST)
if form_user.is_valid() and form_security.is_valid():
data_user = form_user.save()
data_security = form_security.save(commit=False)
data_security.data_user = data_user
data_security.save()
return render_to_response('see_you_later.html')
else:
return render_to_response('error.html')
我总是使用see-error.html,尽管我填写的表单是正确的
模型用户有一个主键。
模型安全性有一个外键
我的模板:
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div class="entry_or_register">
{% load staticfiles %}
<img src="{% static "tumblr.gif" %}" width="1250" height="550">
<form name="registration" method="post" action="save/">
{% csrf_token %}
{{ form_registration_user.as_p }}
{{ form_registration_security.as_p }}
<input type="submit" value="SignUp">
</form>
</div>
</body>
</html>
我不确定您是如何在模板中呈现表单的,但可能是当您单击“提交”时,只有一个表单在HTTP请求中发送其数据 然后另一个表单的构造函数在POST变量中找不到它的键,结果将不是有效的表单。我想这就是你考试总是不及格的原因 现在,我希望您能给我们提供更多关于您尝试做什么的细节,但我认为您需要一个自定义表单类(这将是您当前两个表单的联合),而不是一个ModelForm。 编辑:抱歉,您实际上不需要这样做
祝您好运。您还应该发布相应模板的html标记 无论如何,这里有一个视图,我曾经在同一个页面中保存来自两个ModelForms的数据,用户只需单击一个提交按钮:
def register(request):
message = None
if request.method == 'POST':
user_form = NewUserForm(request.POST)
details_form = UserDetailsForm(request.POST, request.FILES)
if user_form.is_valid():
new_simple_user = user_form.save()
message = _("User inserted")
if details_form.is_valid():
# Create, but don't save the new user details instance.
new_user_details = details_form.save(commit=False)
# Associate the user to the user details
new_user_details.user = new_simple_user
# save a new user details instance
new_user_details.save()
message = _("User details inserted")
else:
user_form = NewUserForm()
details_form = UserDetailsForm()
return render_to_response('register.html', { 'user_form': user_form, 'details_form': details_form, 'message': message,},\
context_instance=RequestContext(request))
谢谢您的回答,但在模板中我通过了两种形式:{%csrf\u token%}{{form\u registration\u user.as\u p}{{form\u registration\u security.as\u p}}我明白了,这很奇怪。只要不存在字段id冲突,在单个
中放置多个表单就可以了。如果我想到什么,我会编辑的。我有一个teg。这是完整的teg{%csrf\u token%}{{form\u registration\u user.as\u p}{{form\u registration\u security.as\u p}}}你应该把它添加到你原来的帖子中,它可能会有帮助:)在我原来的帖子中它是:(谢谢你的回答。但我也尝试过类似的方法,但没有效果:
def register(request):
message = None
if request.method == 'POST':
user_form = NewUserForm(request.POST)
details_form = UserDetailsForm(request.POST, request.FILES)
if user_form.is_valid():
new_simple_user = user_form.save()
message = _("User inserted")
if details_form.is_valid():
# Create, but don't save the new user details instance.
new_user_details = details_form.save(commit=False)
# Associate the user to the user details
new_user_details.user = new_simple_user
# save a new user details instance
new_user_details.save()
message = _("User details inserted")
else:
user_form = NewUserForm()
details_form = UserDetailsForm()
return render_to_response('register.html', { 'user_form': user_form, 'details_form': details_form, 'message': message,},\
context_instance=RequestContext(request))