0

我发现几个帖子的问题几乎与此相同,但我花了很多时间试图根据这些帖子找出我的问题,但我一生都无法解决这个问题。我正在尝试从表单中获取值并将它们放入我的数据库中(然后在我的表单下方列出数据库中的内容,但这对我来说更重要的是看看它是否有效)。似乎没有提取表单值,或者我没有正确保存到数据库中。

这是我的模型:

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>
4

2 回答 2

0

当您使用时,ModelForm您不需要以这种方式创建对象,您只需form.save()在 DB 中添加数据即可。

如果您想引用POSTed 使用的数据,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
        })
于 2013-09-18T05:41:26.080 回答
0

扩展 Rohan 的答案:您正在正确地实例化表单,但随后您忽略了它。您既没有使用它来保存字段,也没有在模板中显示错误。这完全没有首先使用一个。

您的表单未保存的原因肯定是因为您有验证错误。但是由于您没有在模板中输出表单本身,所以您永远不会知道。您可以使用{{ form.as_p }}所有那些手动定义<input>的 s 和<label>s 来代替。另外,通过这样做,您不仅会看到错误,而且那些有效的字段将预先填充先前输入的数据。

其次,正如 Rohan 所说,当您的表单有效时,您将忽略表单数据。cleaned_data包含经过验证的干净数据 - 将 IntegerFields 等内容转换为实际整数。它是一种属性而不是一种方法,并在此处记录。但是对于模型表单,您甚至不需要它:您应该这样做:

if form.is_valid():
    users_obj = form.save()
    return ....
于 2013-09-18T08:08:34.260 回答