Skip to main content
 首页 » 编程设计

python之Django一对一模型中的更新/编辑功能

2025年05月04日33zlslch

我在 Django 中制作了一个编辑表单,但我的更新功能遇到了问题。有一种使用一对一关系的关系模型。当我运行此功能时,用户模型中的数据正确存储,但 UserProfile 模型中没有。

这是我的 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> 
  1. 为什么 User Models 中的数据更新正确但 UserProfile models 中的数据更新不正确?
  2. 解决方案是什么?

非常感谢

请您参考如下方法:

您应该使用 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() 调用。