我发现几个帖子的问题几乎与此相同,但我花了很多时间试图根据这些帖子弄清楚我的问题而且我不能为我的生活弄清楚这一点。我正在尝试从表单中获取值并将它们放入我的数据库中(然后列出我的表单下面的数据库中的内容,但这更适合我,看看它是否正常工作)。似乎没有提取表单值,或者我没有正确保存到数据库。
以下是我的模特:
from django.db import models
from django.forms import ModelForm
class Users(models.Model):
user_first_name = models.CharField(max_length=255)
user_last_name = models.CharField(max_length=255)
email_address = models.CharField(max_length=255)
class UserForm(ModelForm):
class Meta:
model = Users
fields = ['user_first_name', 'user_last_name', 'email_address']
的观点:
from django.shortcuts import render
from django.http import HttpResponseRedirect
from manage_users.models import Users, UserForm
def index(request):
users_list = Users.objects.all()
if request.method == 'POST':
form = UserForm(request.POST)
if form.is_valid():
user_first_name = request.POST.get('user_first_name', '')
user_last_name = request.POST.get('user_last_name', '')
email_address = request.POST.get('email_address', '')
users_obj = Users(user_first_name=user_first_name, user_last_name=user_last_name, email_address=email_address)
users_obj.save()
return HttpResponseRedirect('/')
else:
form = UserForm()
return render(request, 'home.html', {
'form': form, 'users_list': users_list
})
最后,我的HTML:
<body>
<form action="" method="post"> {% csrf_token %}
<div>
<label for="user_first_name">First Name:</label>
<input type="text" id="user_first_name" />
<br><label for="user_last_name">Last Name:</label>
<input type="text" id="user_last_name" />
<br><label for="email_address">Email Address:</label>
<input type="text" id="email_address" />
</div>
<button id ="add" type="submit">Submit</button>
</form>
{% if users_list %}
<ul>
{% for user in users_list %}
<li>{{ user }}</li>
{% endfor %}
</ul>
{% else %}
<p>No users are currently in the system</p>
{% endif %}
</body>
答案 0 :(得分:0)
当您使用ModelForm
时,您不需要以这种方式创建对象,您只需form.save()
即可在数据库中添加数据。
如果您想引用POST
使用form.cleaned_data
而不是request.POST
的数据。
有关详细信息,请参阅ModelForm
文档
提供示例代码:
def index(request):
users_list = Users.objects.all()
if request.method == 'POST':
form = UserForm(request.POST)
if form.is_valid():
#Method 1
user_obj = form.save()
#Method 2 - use form.cleaned_data
user_first_name = form.cleaned_data.get('user_first_name', '')
user_last_name = form.cleaned_data.get('user_last_name', '')
email_address = form.cleaned_data.get('email_address', '')
users_obj = Users(user_first_name=user_first_name,
user_last_name=user_last_name,
email_address=email_address)
users_obj.save()
return HttpResponseRedirect('/')
else:
form = UserForm()
return render(request, 'home.html', {
'form': form, 'users_list': users_list
})
答案 1 :(得分:0)
扩展Rohan的答案:你正确地实例化了表格,但是你忽略了它。您不是用它来保存字段,也不是在模板中显示错误。这完全没有让人首先使用它。
您的表单未保存的原因当然是因为您有验证错误。但由于您没有在模板中输出表单,因此您永远不会知道。您可以使用{{ form.as_p }}
代替所有手动定义的<input>
和<label>
。此外,通过执行此操作,您不仅可以看到错误,还可以使用先前输入的数据预填充那些有效的字段。
其次,正如Rohan所说,当表单有效时,您忽略了表单数据。 cleaned_data
包含经过验证的干净数据 - 将IntegerFields等内容转换为实际整数。它是一个属性而不是方法,并且是documented here。但对于模型表单,您甚至不需要:您应该这样做:
if form.is_valid():
users_obj = form.save()
return ....