django modelForm,只需要保存选定的字段

时间:2015-10-29 19:16:29

标签: django django-models django-forms

如何只在我的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'字段,我会按空值保存其他字段。

还有其他问题,在我的头像领域的顶部我有这个: enter image description here

文档对这两个问题没有帮助

UPD我的表单视图: enter image description here

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>

2 个答案:

答案 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,}, )

但我仍然有头像小部件的问题