如何只在我的modelForm中保存选定的字段?文档对我没有帮助 我的表格:
dev
我的观点:
class ProfileForm(forms.ModelForm):
class Meta:
model = CustomUser
fields = ['avatar', 'firstname', 'lastname',
'date_of_birth',]
widgets = {
'date_of_birth': SelectDateWidget(years=range(1920, 2015)),
}
在html代码中它只是:
def cabinet(request):
profile_user = CustomUser.objects.filter(pk = request.user.pk)
profile = CustomUser.objects.get(pk = request.user.pk)
form = ProfileForm(request.POST, request.FILES or None, instance=profile)
if request.POST and form.is_valid():
obj = form.save(commit=False)
obj.profile_user = CustomUser.objects.get(pk=request.user.pk)
obj.save()
return redirect(reverse(cabinet))
return render(request, 'cabinet.html',
{'form':form, 'profile_user': profile_user,}, )
因此,如果我只想更改我的'name'字段,我会按空值保存其他字段。
文档对这两个问题没有帮助
UPD我的CustomUser模型:
<form action="{% url 'cabinet' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form|crispy }}
<button class="btn btn-default" type="submit">Submit</button>
</form>
答案 0 :(得分:2)
您只需要在保存之前从cleaned_data
中删除其他字段。
覆盖save
方法,并从那里删除它,它应该可以正常工作。
class ProfileForm(forms.ModelForm):
# skip initial details
def save(self, commit=True):
self.cleaned_data = dict([ (k,v) for k,v in self.cleaned_data.items() if v != "" ])
return super(ProfileForm, self).save(commit=commit)
答案 1 :(得分:1)
我终于解决了这个问题。无需改变save()方法。
只需更新我的功能:
def cabinet(request):
profile_user = CustomUser.objects.filter(pk = request.user.pk)
profile = CustomUser.objects.get(pk = request.user.pk)
if request.method == 'POST':
form = ProfileForm(request.POST, request.FILES or None, instance=profile)
if form.is_valid():
form.save()
else:
form = ProfileForm(instance=profile)
return render(request, 'cabinet.html',
{'form':form, 'profile_user': profile_user, 'rating':rating,}, )
但我仍然有头像小部件的问题