有效的django表格不保存

时间:2010-07-02 02:18:38

标签: django django-forms validation

在我编辑朋友的视图中,我正在检查表单是否有效,然后保存表单。但不知何故,数据没有更新。为什么我的更新表单未保存?它是100%有效的,因为我之前已经检查过它。

我的表格:

class FriendForm(forms.ModelForm):
    first_name = forms.CharField(widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50)), label="First name")
    last_name = forms.CharField(widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50)), label="Last name")
    pid = forms.RegexField(regex=r'^\d{11}', max_length=11 ,widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50)))
    image = forms.ImageField(label="Image", required=False)
    street = forms.CharField(widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50)), label="Street")
    number = forms.CharField(widget=forms.TextInput, label="House/flat number")
    code = forms.RegexField(regex=r'^\d{2}[-]\d{3}', max_length=6, widget=forms.TextInput(attrs=attrs_dict), label="Postal code")
    city = forms.CharField(widget=forms.TextInput, label="City")

观点:

def edit_friend(request, id):
    userprofile = UserProfile.objects.get(user=request.user)
    friend = get_object_or_404(Friend, id=id)
    if friend.friend_of.id!=userprofile.id:
        raise Http404 
    if request.method == 'POST':
        form = FriendForm(request.POST, request.FILES, instance=friend)
        if form.is_valid(): 
            form.save()           
        return HttpResponseRedirect(reverse('user_profile',))
    else:
        form = FriendForm(instance=friend)
    return render_to_response('user/data_operations/edit_friend.html', {
            'form':form, 'user':request.user,
            }, context_instance=RequestContext(request))

模板:

<form method="post" action="." enctype="multipart/form-data">
    <table>           
        {{ form.as_table }}
        <tr>
            <td>&nbsp;</td>
            <td>
                <input type="submit" class="submit" name="submit" value="Save" />
            </td>
        </tr>
    </table>
</form>

4 个答案:

答案 0 :(得分:3)

我需要看到你的表单的完整代码才能真正回答这个问题(你可以加入吗?)但是这里有一些初步想法:

FriendFormdjango.forms.ModelForm的子类吗?如果是这样,则不需要覆盖save方法 - 特别是因为你在这里所做的只是获取返回的新对象,再次保存它(并再次),然后再返回它 - 没有其他处理额外的好处。

如果FriendForm不是ModelForm的子类,它如何绑定到数据库数据?它继承了什么类?


<强>更新
ModelForms没有直接连接到数据库 - 它们是创建用于与数据库模型交互的HTML表单的快捷方式 - 即继承自django.models.Model的类。您可以在Meta内创建ModelForm课程。

使用ModelForm,您无需手动指定字段(django会自动为您执行此操作),除非您要覆盖特定行为。你必须告诉django你想使用哪个数据库模型。如果您已经定义了数据库Model,请使用它;如果没有,试试这个:

# in models.py
from django import models

class Friend(models.Model):
    first_name = models.CharField( "see <http://docs.djangoproject.com/en/dev/ref/models/fields/> to adjust your syntax" )
    ... your other fields ...


# in forms.py
from django.forms import ModelForm
from my_project.my_app.models import Friend

class FriendForm(ModelForm):
    class Meta:
        model = Friend

就是这样!现在您的FriendForm应该正常运行。有关使用ModelForm的详细信息,请参阅http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

或者,您根本不需要使用ModelForm。您可以将以下save方法添加到现有的FriendForm

def save(self):
    if self.is_valid():
        from myproject.myapp.models import Friend
        new_friend = Friend(**self.cleaned_data)
        new_friend.save()
        return new_friend

......这里的本质是您正在导入Friend模型,该模型封装了数据库存储行为。这基本上是ModelForm自动为您创建的内容,但不是那么强大 - 所以我建议使用ModelForm

答案 1 :(得分:1)

有时候,如果你在开发过程中添加像@ transaction.commit_on_success这样的装饰器,它会阻止在有一个错误的情况下保存表单。

答案 2 :(得分:0)

我认为您可能会使用这些表单字段覆盖您的模型字段。 检查this。通常,当你有一个模型表格时,你需要做的就是定义一个元类并传递你所需的额外设置(渲染字段,它们的小部件,它们的标签等)。

答案 3 :(得分:0)

也许您应该为表单标记设置action属性。

<form action="{% url 'edit' %}" method="post">