gpt4 book ai didi

UserProfile 的 Django 表单问题

转载 作者:行者123 更新时间:2023-12-02 08:46:35 27 4
gpt4 key购买 nike

我想创建一个“更新用户的个人资料”页面来让用户修改他们的个人资料,所以我想出了以下模型:

class Profile(models.Model):
user = models.OneToOneField(User)

nick_name = models.CharField(blank=True,max_length=100)
school = models.CharField(blank=True,max_length=100)
motto = models.CharField(blank=True,max_length=100)

class ProfileForm(ModelForm):
class Meta:
model = Profile

我的 View 设计为:

@login_required
def update_profile_view(request):
if request.method == 'POST':
user = request.user
try:
profile = user.get_profile()
except Exception:
profile = Profile.objects.create(user=user)
form = ProfileForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
profile.nick_name = cd['nick_name']
profile.school = cd['school']
profile.motto = cd['motto']
profile.save()
return HttpResponseRedirect('/main_page/')
else:
form = ProfileForm()
return render(request, 'update_profile.html', {'form':form})

用户和配置文件之间的关系显然是一对一的,通过请求我可以确定当前用户。因此不需要填写表单的用户字段。不幸的是,这无法通过“form.is_valid()”测试。在调用“is_valid”之前似乎很难修改表单。为简单起见,我不想创建自己的表单类,也不想编写自定义表单验证。还有其他方法可以解决这个问题吗?

最佳答案

您的 View 可以大大简化:

@login_required
def update_profile_view(request):
try:
profile = Profile.objects.get(user=request.user)
except Profile.DoesNotExist:
profile = None

form = ProfileForm(request.POST or None, instance=profile)

if request.method == 'POST':
if form.is_valid():
form.save()
return HttpResponseRedirect('/main_page/')
return render(request, 'update_profile.html', {'form':form})

无需像您一样手动分配字段。 Django ORM 知道如何自动执行插入和更新。因此,如果您只是将 Profile 的实例传递给 ProfileForm,它就会知道要进行更新。如果没有配置文件的实例,它将执行插入操作。

现在,如果您想在 UI 中透明地分配用户,您需要从表单中排除 user 字段并自行分配。有几种不同的方法可以做到这一点。

我还建议在您的重定向中利用 reverse,这样您就没有硬编码的路径。

关于UserProfile 的 Django 表单问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12006736/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com