在我编辑朋友的视图中,我正在检查表单是否有效,然后保存表单。但不知何故,数据没有更新。为什么我的更新表单未保存?它是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> </td>
<td>
<input type="submit" class="submit" name="submit" value="Save" />
</td>
</tr>
</table>
</form>
答案 0 :(得分:3)
我需要看到你的表单的完整代码才能真正回答这个问题(你可以加入吗?)但是这里有一些初步想法:
FriendForm
是django.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">