django一对一模型中的更新/编辑功能
update / edit function in django one-to-one models
我在 django 中做了一个编辑表单,但我的更新功能有问题。有一种使用一对一关系的关系模型。当我运行这个函数时,用户模型中的数据正确存储,但不是在用户配置文件模型中。
这是我的urls.py
url(r'^update_user/(?P<pk>\d+)$', views.update_user, name='update_user'),
这是我的模型:
class UserProfile(models.Model):
user = models.OneToOneField(User)
CATEGORY_CHOICES = (
('admin','Admin'),
('user','User'),
)
hak_akses = models.CharField(max_length=100, choices = CATEGORY_CHOICES)
def __unicode__(self):
return self.user.username
这是我的views.py
def update_user(request, pk, template_name='form_user.html'):
related = User.objects.select_related().all()
user = get_object_or_404(related, pk=pk)
# profile = get_object_or_404(UserProfile, pk=pk)
if request.POST:
user_form = UserForm(data=request.POST, instance=user)
profile_form = UserProfileForm(data=request.POST, instance=user)
if user_form.is_valid() and profile_form.is_valid():
user.set_password(user.password)
user.save()
profile = profile_form.save(commit=False)
profile.user = user
profile.save()
return redirect('manajemen_user')
else:
user_form = UserForm(instance=user)
profile_form = UserProfileForm(instance=user)
return render_to_response(template_name, {
'user_form': user_form, 'profile_form': profile_form,
}, context_instance=RequestContext(request))
这是我的表格:
class UserForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput())
class Meta:
model = User
fields = ('username', 'password')
class UserProfileForm(forms.ModelForm):
CATEGORY_CHOICES = (
('admin','Admin'),
('user','User'),
)
hak_akses = forms.ChoiceField(choices = CATEGORY_CHOICES)
class Meta:
model = UserProfile
fields = ('hak_akses',)
这是我的表单模板html:
<form name="tambah_user" class="form-horizontal style-form" method="POST">{% csrf_token %}
<div class="form-group">
<label class="col-sm-2 col-sm-2 control-label">Nama User</label>
<div class="col-sm-10">
<!-- <input type="text" class='form-control'> -->
{{ user_form.username }}
</div>
</div>
<div class="form-group">
<label class="col-sm-2 col-sm-2 control-label">Password</label>
<div class="col-sm-10">
{{ user_form.password }}
</div>
</div>
<div class="form-group">
<label class="col-sm-2 col-sm-2 control-label">Hak Akses</label>
<div class="col-sm-10">
{{ profile_form.hak_akses }}
<br><br><br>
<button type="submit" class="btn btn-theme">Submit</button>
</div>
</div>
</form>
- 为什么用户模型中的数据更新正确,但 UserProfile 模型中的数据更新不正确?
- 有什么解决办法?
非常感谢
您应该使用 UserProfile
实例而不是 User
:
构建 UserProfileForm
表单
profile = UserProfile.objects.filter(user=user).first()
...
profile_form = UserProfileForm(data=request.POST, instance=profile)
...
profile_form = UserProfileForm(instance=profile)
如果您确定配置文件已经存在,那么您可以写:
profile = user.userprofile
而不是 filter().first()
调用。
我在 django 中做了一个编辑表单,但我的更新功能有问题。有一种使用一对一关系的关系模型。当我运行这个函数时,用户模型中的数据正确存储,但不是在用户配置文件模型中。
这是我的urls.py
url(r'^update_user/(?P<pk>\d+)$', views.update_user, name='update_user'),
这是我的模型:
class UserProfile(models.Model):
user = models.OneToOneField(User)
CATEGORY_CHOICES = (
('admin','Admin'),
('user','User'),
)
hak_akses = models.CharField(max_length=100, choices = CATEGORY_CHOICES)
def __unicode__(self):
return self.user.username
这是我的views.py
def update_user(request, pk, template_name='form_user.html'):
related = User.objects.select_related().all()
user = get_object_or_404(related, pk=pk)
# profile = get_object_or_404(UserProfile, pk=pk)
if request.POST:
user_form = UserForm(data=request.POST, instance=user)
profile_form = UserProfileForm(data=request.POST, instance=user)
if user_form.is_valid() and profile_form.is_valid():
user.set_password(user.password)
user.save()
profile = profile_form.save(commit=False)
profile.user = user
profile.save()
return redirect('manajemen_user')
else:
user_form = UserForm(instance=user)
profile_form = UserProfileForm(instance=user)
return render_to_response(template_name, {
'user_form': user_form, 'profile_form': profile_form,
}, context_instance=RequestContext(request))
这是我的表格:
class UserForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput())
class Meta:
model = User
fields = ('username', 'password')
class UserProfileForm(forms.ModelForm):
CATEGORY_CHOICES = (
('admin','Admin'),
('user','User'),
)
hak_akses = forms.ChoiceField(choices = CATEGORY_CHOICES)
class Meta:
model = UserProfile
fields = ('hak_akses',)
这是我的表单模板html:
<form name="tambah_user" class="form-horizontal style-form" method="POST">{% csrf_token %}
<div class="form-group">
<label class="col-sm-2 col-sm-2 control-label">Nama User</label>
<div class="col-sm-10">
<!-- <input type="text" class='form-control'> -->
{{ user_form.username }}
</div>
</div>
<div class="form-group">
<label class="col-sm-2 col-sm-2 control-label">Password</label>
<div class="col-sm-10">
{{ user_form.password }}
</div>
</div>
<div class="form-group">
<label class="col-sm-2 col-sm-2 control-label">Hak Akses</label>
<div class="col-sm-10">
{{ profile_form.hak_akses }}
<br><br><br>
<button type="submit" class="btn btn-theme">Submit</button>
</div>
</div>
</form>
- 为什么用户模型中的数据更新正确,但 UserProfile 模型中的数据更新不正确?
- 有什么解决办法?
非常感谢
您应该使用 UserProfile
实例而不是 User
:
UserProfileForm
表单
profile = UserProfile.objects.filter(user=user).first()
...
profile_form = UserProfileForm(data=request.POST, instance=profile)
...
profile_form = UserProfileForm(instance=profile)
如果您确定配置文件已经存在,那么您可以写:
profile = user.userprofile
而不是 filter().first()
调用。