django - 在 Django 中创建更新或创建表单视图
问题描述
我有一个名为的模型profile
,它与模型具有一对一的关系User
。profile
包含有关用户的不必要信息,例如个人简介、性别、国家/地区等。因此,当用户注册时,他们还没有个人资料。当用户进入设置并开始输入详细信息时,他们将拥有一个配置文件。
话虽如此,我如何在 Django 中创建一个既可以创建有关用户的个人资料详细信息又可以更新现有信息的视图。
形式
class ProfileForm(ModelForm):
class Meta:
model = Profile
fields = ['avatar', 'bio', 'gender', 'dob', 'country']
看法
class SettingsView(FormView):
template_name = 'oauth/settings.html'
form_class = ProfileForm
success_url = reverse_lazy('oauth:settings')
redirect_field_name = "next"
解决方案
尝试这个:
from django.views import View
from .forms import ProfileForm
from .models import Profile
class Settings(View):
form_class = ProfileForm
template_name = 'oauth/settings.html'
def post(self, request):
form = self.form_class(request.POST)
data = {'error':''}
if form.is_valid():
user = request.user
bio = form.cleaned_data['bio']
# more fields here
try:
profile = user.profile
# update user profile
profile.bio = bio
# add more fields here
profile.save()
data['response'] = 'profile updated!'
except:
profile = Profile(user=user,bio=bio) #add more fields
profile.save()
data['response'] = 'profile created!'
else:
data['error'] = 'Invalid form!'
return render(request, self.template_name,{'data':data})
编辑:
或者我们可以update_or_create()
按照 OP 在评论中的建议使用。
通过替换try
和except
块:
updated_values = {'bio':bio} # add more fields
obj, created = Profile.objects.update_or_create(user=user,bio=bio, defaults=updated_values) # add more fields
if created:
data['response'] = 'profile created!'
else:
data['response'] = 'profile updated!'
推荐阅读
- java - 在 AWS CodeBuild 上使用类路径运行独立 jar 通过,但测试实际上并未运行
- java - MapStruct 和泛型转换定义
- swift - Swift 单例中“共享”和“标准”的区别?
- ssh - 远程 SSH 失败 - r30 秒后超时
- node.js - 在 MongoDB 中查找包含特定值的数组的文档的时间复杂度是多少?
- javascript - 如何在嵌套的异步/等待函数中返回数据
- node.js - 运行 rpm install 时出现“code EMISSINGARG”错误
- python - Pyqt5:如何设计功能以使按钮在 pyqt 中按我希望的那样工作?
- php - DateTime::modify 返回错误结果
- symfony - symfony serialize() 从 __sleep() 作为成员变量返回,但不存在