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

标签 django django-models django-forms

如何在我的模型表单中只保存选定的字段?文档对我没有帮助 我的表格:

class ProfileForm(forms.ModelForm):
    class Meta:
        model = CustomUser
       fields = ['avatar', 'firstname', 'lastname',
            'date_of_birth',]

        widgets = {
        'date_of_birth': SelectDateWidget(years=range(1920, 2015)),
        }

我的看法:

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

在 html 代码中它只是:

        <form action="{% url 'cabinet' %}" method="post" enctype="multipart/form-data">
            {% csrf_token %}
            {{ form|crispy }}
            <button class="btn btn-default" type="submit">Submit</button>
        </form>

因此,如果我只想更改我的“名称”字段,我可以将其他字段保存为空值。

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

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

UPD 我的表单 View : enter image description here

更新我的 CustomUser 模型:

class CustomUser(AbstractBaseUser, PermissionsMixin):

    alphanumeric = RegexValidator(r'^[0-9a-zA-Z]*$', message='Only                     alphanumeric characters are allowed.')

    username = models.CharField(unique=True, max_length=30, validators=[alphanumeric])

    email = models.EmailField(
    'Email',
    max_length=255,
    unique=True,
    db_index=True
    )
    avatar = models.ImageField(
    'Avatar',
    blank=True,
    null=True,
    upload_to='user/avatar',
    default='user/default.jpg'
    )
    firstname = models.CharField(
    'First name',
    max_length=40,
    blank=True,
    null=True
    )
    lastname = models.CharField(
    'Last name',
    max_length=40,
    blank=True,
    null=True
    )
    date_of_birth = models.DateField(
    'Date of birth',
    blank=True,
    null=True
    )
    register_date = models.DateField(
    'Register date',
    auto_now_add=True
    )
    is_active = models.BooleanField(
    'Active',
    default=True
    )
    is_admin = models.BooleanField(
    'Superuser',
    default=False
    )

    @property
    def is_staff(self):
        return self.is_admin

    def get_short_name(self):
        return self.email

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    objects = UserManager()

    class Meta:
        verbose_name = 'User'
        verbose_name_plural = 'Users'

最佳答案

您只需要在保存之前从 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)

关于django modelForm,只需要保存选定的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33422783/

相关文章:

django 中的 css javascript 图像

django - Django 的工作日

Regexfield 不足以验证文本输入(Django 表单)

django - 在 __init__ 处动态添加到 ModelForm 的字段不会保存

django - 如何使用solr从django haystack中的单个查询中获取两个不同的搜索结果

jquery - 当后端表单验证失败时,如何在 jQuery 对话框中重新打开 Django 表单?

javascript - 单击确认添加复选框长度

python - 查找相关对象并显示关系

django - 在 Django 模型中排序多对多关系

django - 使用 get_object_or_404 时无法解压不可迭代的 int obj