django modelForm,只需要保存选定的字段
django modelForm, need to save only selected fields
如何在我的 modelForm 中只保存选定的字段?文档对我没有帮助
我的表格:
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>
所以,如果我只想更改我的 'name' 字段,我会用空值保存其他字段。
这里还有其他问题,在我的头像字段顶部,我有这个:
文档对这两个问题都没有帮助
UPD 我的表单视图:
更新我的 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)
我终于解决了这个问题。无需更改 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,}, )
但头像小部件仍然存在问题
如何在我的 modelForm 中只保存选定的字段?文档对我没有帮助 我的表格:
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>
所以,如果我只想更改我的 'name' 字段,我会用空值保存其他字段。
这里还有其他问题,在我的头像字段顶部,我有这个:
文档对这两个问题都没有帮助
UPD 我的表单视图:
更新我的 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)
我终于解决了这个问题。无需更改 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,}, )
但头像小部件仍然存在问题